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
Una
Activity
llamadaMainActivity
Un Servicio de
IntentService
llamadoRefreshService
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