7

La mejor manera que puedo describir mi problema es la siguiente:La notificación abre la actividad, se presiona el botón Atrás, se abre la actividad principal?

  1. Una notificación se crea en el arranque (con un BroadcastReceiver).
  2. La actividad principal de mi aplicación se abre y se presiona el botón de inicio (la aplicación todavía se ejecuta en segundo plano hasta que el sistema la cierra).
  3. Desplizo la barra de estado y presiono sobre la notificación creada previamente en el arranque.
  4. Se inicia alguna actividad, diferente de la principal.
  5. Presiono el botón Atrás y se muestra la actividad principal.

¿Cómo puedo evitar ese último paso? Lo que quiero con el botón Atrás es regresar donde estaba, que es la pantalla de inicio (el escritorio con todos los widgets y los iconos de la aplicación). Se suponía que la actividad principal de mi aplicación se ejecutaba en segundo plano, ¿por qué se llamó con el botón Atrás?

En caso de que sea relevante, mi código para crear una notificación es el siguiente:

public void createNotification(int notifyId, int iconId, String contentTitle, String contentText) { 
    Intent intent = new Intent(mContext, NewNoteActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.putExtra(AgendaNotesAdapter.KEY_ROW_ID, (long)notifyId); 

    PendingIntent contentIntent = PendingIntent.getActivity(mContext, notifyId, intent, 0); 

    Notification notification = new Notification(iconId, contentTitle, 0); 
    notification.setLatestEventInfo(mContext, contentTitle, contentText, contentIntent); 

    mNotificationManager.notify(notifyId, notification); 

He intentado añadir un par de más combinaciones banderas a intent pero ninguno de ellos resolvió mi problema ... Sugerencias?

Respuesta

3

Su problema está en seguir los pasos que sé de su pregunta es

1.Create notificación después de arranque completo la actividad

2.Main llamará en el arranque

3.you casa presionado botón para que la actividad principal se detenga pero no destruirá

4.Haga clic en la notificación de la barra de estado para que ya tenga actividad principal en su back stack y la notificación se creará e nueva actividad como usted menciona en su actividad NewNoteActivity cuestión será empuje en la parte posterior stack.SO en este paso you have two activities in back stack

5.you presionado el botón atrás de manera que last activity will be destroy y su main activity will be resume Pero quiere ir a la pantalla de la página principal.

Así que el problema está en su siguiendo los pasos que sé de su pregunta se

1.Create notificación después de arranque completo la actividad

2.Main llamará en el arranque

3.you botón de inicio presionado por lo que la actividad principal se detendrá pero no destruirá

4.Haga clic en la notificación de la barra de estado para que ya tenga actividad principal en su back stack y notificación wi Creará nueva actividad como la que mencionaste en tu pregunta. La actividad de NewNoteActivity será push on back stack.SO en este paso you have two activities in back stack

5.presionó el botón Atrás para que last activity will be destroy y su main activity will be resume Pero desea abrir la actividad de la página principal cuando presionó el botón Atrás desde la actividad NewNoteActivity.

Así que la solución es que cuando pulsó el botón atrás de su NewNoteActivityactivity de empezar la actividad principal de nuevo con Intent.FLAG_ACTIVITY_CLEAR_TOP bandera para que su actividad va a recrear y recibirá onNewIntent() método por lo que no se puede obtener la bandera y se puede terminar la actividad principal

por ejemplo

@Override 
    public void onBackPressed() { 
     Intent i = new Intent(this, Main.class); 
    i.putExtra("exit", true); 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(i); 
    super.onBackPressed(); 
    } 

Ahora usted tiene que poner en práctica onNewIntent() método en su actividad principal

Al presionar el botón Atrás desde la actividad NewNoteActivity, su actividad principal llamará al método onNewIntent(), por lo que en este método debe obtener la variable de indicador que se pasa de la actividad NewNoteActivity. Si obtiene el indicador y si es verdadero, simplemente termine la actividad Principal para que obtendrá la pantalla de inicio.

EDITAR

Usted está diciendo que usted tiene cualquiera de la actividad de la A, B, o C se abre y se ha pulsado el botón atrás para que esta actividad será closed.If sólo tiene una actividad pila en ese momento su aplicación se cerrará significa que obtendrá la pantalla de inicio. Pero si tiene más de una actividad y presionó el botón Atrás tiene al menos una actividad en la pila y ahora hace clic en notificación para que se abra una nueva actividad asociada a su notificación para que esta actividad se presione en la pila de atrás. Ahora, si presiona el botón Atrás, su última actividad asociada a su notificación se cerrará si no ha modificado el método de prueba de respuesta() en esa acti vity y luego revisará la pila si hay actividad en la parte posterior de la pila para que la actividad se reanude o si no hay actividad en la pila posterior, entonces su aplicación se cerrará y obtendrá la pantalla de inicio

+0

Casi que ... La cuestión es que no tengo actividad en la página de inicio, me has entendido mal. Lo que quería decir es que quería volver a la pantalla de inicio, el escritorio, donde tienes todos tus widgets con un fondo de pantalla ... –

+0

He editado mi respuesta ahora, puedes consultarla. – Dharmendra

+0

Parece que podría funcionar pero también parece un truco sucio. Todo lo que dijiste tiene sentido, pero no estoy contento con esa solución y no voy a usarla. Pero creo que funciona y resuelve el problema, así que lo estoy marcando como una respuesta aceptada. –

3

Tenía el mismo problema. Lo que funcionó para mí se ponía en el manifiesto de la siguiente atributo a la actividad puesta en marcha por la notificación:

android:taskAffinity=""

Esto separa esencialmente la afinidad de la actividad de la notificación de la actividad principal y por lo que el sistema operativo no lo hace siente la necesidad de "regresar" a la actividad principal, pero simplemente vuelve a lo que estaba antes, por ejemplo el escritorio".

+0

no sé lo que significa pero funciona perfectamente – yasiriqbal776

19

Para quién todavía podría necesitar respuesta. Parece que esto es lo que desea lograr:

Cuando inicia un Activity desde una notificación, debe conservar la experiencia de navegación esperada del usuario. Al hacer clic en Atrás, debe llevar al usuario a través del flujo de trabajo normal de la aplicación a la pantalla de inicio, y hacer clic en Recientes debe mostrar la Actividad como una tarea separada.

http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

Su situación es - Setting up a regular activity PendingIntent

consulte los pasos de pleno derecho en el enlace.Básicamente lo que necesita:
1. Definir Activity jerarquía en AndroidManifest.xml

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
<activity 
    android:name=".ResultActivity" 
    android:parentActivityName=".MainActivity"> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".MainActivity"/> 
</activity> 


2. Crear un volver pila basado en la Intent que inicia el Activity:

... 
Intent resultIntent = new Intent(this, ResultActivity.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// Adds the back stack 
stackBuilder.addParentStack(ResultActivity.class); 
// Adds the Intent to the top of the stack 
stackBuilder.addNextIntent(resultIntent); 
// Gets a PendingIntent containing the entire back stack 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
... 
NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
builder.setContentIntent(resultPendingIntent); 
NotificationManager mNotificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
mNotificationManager.notify(id, builder.build()); 
+0

esta es la mejor respuesta –

+0

He encontrado un problema al hacer clic en la notificación y abrir la actividad e ir a la pantalla de inicio y luego de unos segundos le envío una nueva notificación. ya no recibirá una notificación nuevamente. Usar el código anterior me ayuda. ¡Gracias! – natsumiyu

0

Funciona para mí. intente esto:

notifyIntent.setAction(Intent.ACTION_MAIN); 
notifyIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
1

Uso esta solución en mis aplicaciones. Anula onBackPressed (en tu actividad enrutada a partir de la notificación) y comprueba si tu aplicación está en la pila o no. si no, comienza tu actividad raíz. El usuario siempre puede navegar desde su actividad raíz. Esto es lo que hago en mis aplicaciones

@Override 
public void onBackPressed() { 
    if (isTaskRoot()) { 
     Intent intent = new Intent(this,YourMainActivity.class); 
     startActivity(intent); 
     super.onBackPressed(); 
    }else { 
     super.onBackPressed(); 
    } 
} 
Cuestiones relacionadas