Actividad PopUp comienza de nuevo cuando se inicia desde "aplicaciones recientes"

Tengo una actividad PopUp que se inicia cuando AlarmManager recibe una alarma.

AlarmReceiver extiende WakefulBroadcastReceiver:

@Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, AlarmService.class); service.putExtras(intent); // Start the service, keeping the device awake while it is launching. startWakefulService(context, service); } 

AlarmService extiende IntentService:

 @Override protected void onHandleIntent(Intent intent) { Intent i = new Intent(); i.setClass(this, PopUpActivity.class); startActivity(i); AlarmReceiver.completeWakefulIntent(intent); } 

PopUpActivity:

 @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL); getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); setContentView(R.layout.layout_dialog); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ClientConstants.WAKE_LOCK_NOTIFICATION); // Acquire the lock wl.acquire(); if (canVibrate){ vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(new long[]{ 0, 200, 500 },0); } if (canRing){ mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(this, getAlarmUri()); final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mediaPlayer.prepare(); mediaPlayer.start(); } } catch (IOException e) { } } findViewById(R.id.dialog_ok_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { stopRinging(); finish(); } }); // Release the lock wl.release(); } private void stopRinging(){ if (canRing && mediaPlayer.isPlaying()) mediaPlayer.stop(); if (canVibrate){ vibrator.cancel(); } } 

PopUpActivity se inicia desde un administrador de alarmas. Si se inicia PopUpActivity cuando la aplicación no es la aplicación activa y si el usuario presiona "botón OK", la actividad desaparece. No hay nada malo aquí hasta ahora. El problema es que si el usuario abre la pantalla de aplicaciones recientes y selecciona la actividad, se reinicia una nueva PopUpActivity . ¿Cómo puedo deshacerme de este problema?

Cuando declare su PopupActivity en su manifiesto, asegúrese de incluir android:noHistory="true" . Esto significa que tan pronto como abra "recents", la actividad emergente se olvidará y volverá a donde estaba antes cuando vuelva a abrir la aplicación.

Cuando el usuario presiona el botón Ok , se está llamando al método Activity.finish() . Esto resulta en la Activity está siendo destruida. Por lo tanto, cuando el usuario selecciona la aplicación de la sección de la aplicación reciente, la Activity se crea de nuevo.

En caso de que no desee destruir la Activity pero desea ponerla en segundo plano, reemplace el método Activity.finish () por Activity.moveTaskToBack (boolean) .

 findViewById(R.id.dialog_ok_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { stopRinging(); moveTaskToBack(true); } }); 

Debe manejar escenarios en los que se reinicie la actividad después de haber sido eliminado debido a la escasez de memoria y los cambios de configuración.

Puede establecer FLAG_ACTIVITY_SINGLE_TOP en los indicadores de Iniciación de inicio de Activity para asegurarse de que la nueva instancia no se crea si ya se está ejecutando en la parte superior de la pila del historial.

En su manifiesto, en la sección de su Activity , pruebe esto:

 <activity> android:launchMode="singleTask" </activity> 

Si quieres que tu Activity no aparezca en la lista de aplicaciones recientes , prueba

 <activity> android:excludeFromRecents="true" </activity> 

Espero que esto ayude.

Cuando presione el botón OK, finish() la actividad y seleccionándola nuevamente desde el historial, obviamente volverá a crearla.

Lo que debe hacer es ocultar esta actividad de alarma de history / recents usando android:excludeFromRecents="true"

Y use launchMode = "singleInstance" con esto para que android nunca pueda hacer otras dos instancias de esta actividad al mismo tiempo.

Puede evitar este problema simplemente agregando indicador a la intención que inicia la actividad que indica que no se mostrará en las tareas recientes:

 Intent i = new Intent(); i.setClass(this, PopUpActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); startActivity(i); 

La configuración de Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS hará su PopupActivity invisible en las tareas recientes.

  • Fuga de receptor de difusión administrada localmente?
  • Cómo detectar cuando se pulsa el botón de encendido en la clase Receptor de difusión cuando se activa el permiso Administrador de dispositivos en Android
  • BroadcastReceiver no se llama cuando la pantalla está bloqueada en Android
  • Permiso personalizado con intención implícita
  • Intercepción de SMS de Android sin icono de notificación o mensajes WAP-PUSH
  • Instancia diferente de Applicationcontext en Broadcastreceiver
  • BroadcastReceiver con múltiples filtros o BroadcastReceivers múltiples?
  • Android - enviarOrderedBroadcast ayuda
  • El propósito del servicio debe ser explícito: Intención
  • ¿No puedo recibir la emisión en el cambio de estado de la batería?
  • GCM de Android (notificación push): el dispositivo no recibe notificación si se detiene la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.