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:
- Problemas con los problemas de conectividad de Google Maps V2
- Android: escucha el mensaje de difusión instalado / actualizado de la aplicación
- Android: ACTION_BATTERY_LOW no se activa en el emulador. Receptor registrado en código, no manifestado
- ReceiverRestrictedContext no se puede convertir en android.app.Activity
- BroadcastReceiver para SMS de varias partes
@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?
- AlarmManager activa alarmas en el pasado inmediatamente antes de que BroadcastReceiver pueda reprogramarlo
- ¿Qué es más eficiente Broadcast Receiver o Handler?
- Android detecta AudioRecord / maneras de grabar audio sin bloquear otras aplicaciones
- ¿Cómo crear una aplicación Android con sólo 1 broadcastreceiver?
- Repetir alarmas cada lunes en Android usig AlarmManager / BroadcastReceiver
- Android intención para sdcard listo
- Administrador de alarmas programado no funciona Android
- Android - "El receptor exportado no requiere permiso" en receptores destinados a recibir de los servicios del sistema
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.
- Mantenimiento de cookies entre las solicitudes HTTP enviadas por Android Apps
- Android Studio Error – error de libpng: No es un archivo PNG