thread tareas studio servicios servicio segundo saber plano example esta ejemplo como activo android android-intent android-activity android-notifications intentservice

servicios - tareas en segundo plano android studio



La notificación creada por IntentService utiliza siempre un Intento incorrecto (1)

Problema

Cuando el usuario presiona Enviar "Botón 1" (desplácese hacia abajo para ver la construcción de la aplicación), se crea una nueva Notification desde el Servicio de RefreshService . Si el usuario presiona esta notificación, se MainActivity una instancia de MainActivity y recibe un String con el valor del Button 1 sobre el Intent .

Este valor se muestra.

Cuando el usuario presiona ahora Enviar "Botón 2", se crea una nueva Notification desde RefreshService . Si el usuario presiona esta notificación, se MainActivity una instancia de MainActivity y recibe una String TAMBIÉN con el Button 1 valor Button 1 sobre la Intent .

Entonces, como puede adivinar, normalmente debería haber el valor Button 2 .

Cuando el primer Botón que el usuario presionó fue Enviar "Botón 2" , siempre se enviaría el Button 2 .

La única solución para obtener el valor del segundo botón es reiniciar el teléfono y presionar el segundo botón primero. Incluso el cierre forzado no funciona.

Sé que también puedo cambiar la UI de otra manera. Pero necesito este enfoque en una aplicación donde necesito reiniciar la "actividad principal" con otra Intent para que el enfoque sea el mismo.

Construcción

Actividad principal

public class MainActivity extends Activity implements View.OnClickListener { public static final String RECEIVED = "received"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ((TextView)findViewById(R.id.textView_received)).setText(getIntent().getStringExtra(RECEIVED)); findViewById(R.id.button_1).setOnClickListener(this); findViewById(R.id.button_2).setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(this, RefreshService.class); if(v.getId() == R.id.button_1){ intent.putExtra(RECEIVED, "Button 1"); Toast.makeText(this,"Sent /"Button 1/"",Toast.LENGTH_LONG).show(); } else if(v.getId() == R.id.button_2){ intent.putExtra(RECEIVED, "Button 2"); Toast.makeText(this,"Sent /"Button 2/"",Toast.LENGTH_LONG).show(); } startService(intent); } }

RefreshService

public class RefreshService extends IntentService { public RefreshService() { super("RefreshService"); } @Override protected void onHandleIntent(Intent intent) { String received = intent.getStringExtra(MainActivity.RECEIVED); Intent notificationIntent = new Intent(this, MainActivity.class); notificationIntent.putExtra(MainActivity.RECEIVED, received); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setContentTitle("IntentServiceRefresh").setContentText(received).setSmallIcon(R.drawable.ic_notification_small).setContentIntent(pendingIntent); Notification notification = builder.build(); // Hide the notification after it''s selected notification.flags |= Notification.FLAG_AUTO_CANCEL; NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notification); } }

Diseño de la aplicación


Mi sospecha es que, dado que lo único que cambia en el Intent son los extras, el método de fábrica PendingIntent.getActivity(...) simplemente está reutilizando el viejo intento como una optimización.

En RefreshService, intente:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

Ver:

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT