Notificación para poner Actividad en primer plano sólo si está en segundo plano
Estoy tratando de hacer una aplicación similar a la aplicación nativa de alarma. Por lo tanto, este es el resultado ideal que estoy buscando. AlarmGoOffActivity recibe una intención pendiente, se dispara y muestra la alarma con los botones de snooze y dismiss, que he logrado. Tiene que ejecutarse como una sola instancia en todo momento. Y la instancia debe mover primer plano / fondo con la ayuda de los botones de inicio / retroceso y un icono de notificación (la notificación se libera al mismo tiempo que la alarma)
Pero, a partir del código que he escrito, puedo
- El proceso de fondo de la aplicación se detiene, si el dispositivo se ha iniciado
- Notificación multilínea
- Procesos eliminados por el sistema Android: ¿se eliminan las notificaciones en curso?
- Hacer de un servicio un servicio de primer plano
- Tamaño del icono de notificación en Android
1) Notificación y alarma de la exhibición. Cuando se hace clic en la notificación, no importa dónde esté (primer plano o fondo), se pone en primer plano.
2) Cuando la actividad se pone en primer plano, una pantalla blanca junto con la barra de acción se muestra, antes de la pantalla de alarma real.
Esto es lo que tengo que hacer
1) Cuando el usuario comprueba la alarma y presiona la pantalla de inicio o el botón Atrás y la actividad entra en segundo plano, necesito llevarla adelante con la ayuda de la notificación . 2) Sin embargo, si la actividad ya está en primer plano y se hace clic en el icono de notificación, no debería suceder nada.
Si puedes sugerir lo que necesito cambiar en este código para que funcione, eso sería genial.
AndroidManifest.xml
<activity android:name="com.alarm.productive.justalarm.Activities.AlarmGoOffActivity" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait"> </activity>
Parte de notificación de AlarmGoOffActivity.java
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.clock_logo) .setContentTitle(utilFunctions.toCamelCase(currentAlarmInView.getName())) .setContentText("Snooze or Dismiss Alarm"); Intent resultIntent = new Intent(context, AlarmGoOffActivity.class); resultIntent.putExtra(DBHelper.COLUMN_ID,currentAlarmInView.getId()); if(isSnooze){ resultIntent.putExtra(DBHelper.TASK_TITLE,"snooze"); } resultIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addParentStack(AlarmGoOffActivity.class); stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 1001, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager)context. getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(currentAlarmInView.getId(), mBuilder.build());
- Evitar los sonidos de notificación múltiple android
- Desplazamiento del texto del cuerpo en la notificación de Android
- NotificationCompat no se puede resolver a un tipo
- Android: determina si las notificaciones están desactivadas por el usuario
- Pin Notificación a la parte superior del área de notificación
- ¿Por qué se necesita NotificationCompat?
- Abra la aplicación después de hacer clic en Notificación
- Notificaciones locales en Android?
No es necesario utilizar TaskStackBuilder
porque su tarea contiene sólo 1 Actividad. El uso de TaskStackBuilder
hará que su actividad se reinicie, que no es lo que desea.
No es necesario utilizar Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
. Este indicador se utiliza para reordenar las actividades dentro de una tarea . Su tarea contiene sólo una Actividad, por lo que reordenarla al frente es inútil ya que ya está en el frente (de la tarea).
Intent.FLAG_ACTIVITY_NEW_TASK
utilizar Intent.FLAG_ACTIVITY_NEW_TASK
para iniciar la Actividad en una nueva tarea (si la Actividad no se está ejecutando en una tarea existente), o simplemente traer una tarea existente al primer plano (si ya se está ejecutando) .
Cree su notificación como esta en su lugar:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.clock_logo) .setContentTitle(utilFunctions.toCamelCase(currentAlarmInView.getName())) .setContentText("Snooze or Dismiss Alarm"); Intent resultIntent = new Intent(context, AlarmGoOffActivity.class); resultIntent.putExtra(DBHelper.COLUMN_ID,currentAlarmInView.getId()); if (isSnooze){ resultIntent.putExtra(DBHelper.TASK_TITLE,"snooze"); } // Setting this flag ensures that the task will be brought forward if // it is in the background, but nothing will happen if it is already // in the foreground resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 1001, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent);