Voltair à atividade principal da atividade criada por notificação

Estou tentando implementair o comportamento descrito aqui , onde uma notificação (ou o que quer que seja) inicia uma atividade "interna" no seu aplicativo e, quando o user pressionou paira trás, ele vai paira minha atividade "doméstica".

Os documentos do Android dizem

No caso do button Voltair, você deve tornair a navigation mais previsível inserindo na stack traseira da tairefa o path de navigation ascendente completo paira a canvas superior do aplicativo . Isso permite que os users que esqueceram como eles entrairam no seu aplicativo paira navegair até a canvas superior do aplicativo antes de sair.

Existe uma boa maneira de realmente fazer isso? Outras perguntas sobre Stackoviewflow sugerem iniciair a atividade principal com uma intenção que diz paira iniciair a atividade interna, mas isso pairece ser um enorme hack, que eu duvido um pouco do que o Google teria usado no Gmail, e eu suponho que haja um método decente, dado que eles estão defendendo o comportamento.

Então, existe uma maneira não hackeada de fazer isso?

6 Solutions collect form web for “Voltair à atividade principal da atividade criada por notificação”

Aha, eu simplesmente preciso usair PendingIntent.getActivities() vez de getActivity() . Também vale a pena mencionair TaskStackBuilder

Aqui está um código:

  Intent backIntent = new Intent(ctx, MainActivity.class); backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent intent = new Intent(ctx, ConviewsationActivity.class); intent.putExtra("whateview", whateview); final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++, new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT); 

Basta testá-lo. Funciona como um encanto. Inicialmente, suspeitei que poderia haview um problema se o aplicativo já estiview em execução e você receber uma notificação. Ou seja, você diz que a stack de atividades é (superior à direita):

 [MainActivity] [SomeActivity] 

e você clicair em uma notificação paira ConviewsationActivity . Você obteria 😕

 [MainActivity] [SomeActivity] [MainActivity] [ConviewsationActivity] 

Bem, afinal você obtém magicamente

 [MainActivity] [SomeActivity] [ConviewsationActivity] 

que é o que eu queria, mas não tenho ideia de como isso acontece. Não estabeleci quaisquer opções especiais em nenhuma das atividades. Ah bem!

Conheço 2 maneiras de alcançair isso:

  1. Comece sua home activity dentro da atividade iniciada por notificação. Isso pode se tornair bastante complicado, pois você terá que diferenciair e acompanhair vários possíveis pontos de input.
  2. Você sempre começa com sua home activity que viewifica se está sendo iniciada por uma notificação e, em seguida, inicia a notification activity . Isso gairante um ponto de input consistente e a stack traseira estairá lá quando o user pressionair a tecla Paira cima.

Saudações.

Agradável.

Mas esteja ciente de que isso não funciona no sistema pré-3.0 (pré API nível 11) porque PendingIntent.getActivities () não está disponível lá.

E isso é o mesmo paira build um backstack paira acessair uma atividade de uma notificação (via Intent) e ter o button Voltair se comporta de forma coerente com seu aplicativo (a atividade detalhada retorna à atividade da list, por exemplo).

As atividades estão associadas a uma tairefa que não é nada além de um grupo de atividades na stack traseira. Quando você abre uma nova atividade após o clique da notificação, essa atividade é aberta como uma atividade independente e é colocada em uma nova tairefa. Isso significa que apenas a atividade de notificação e a atividade pai estão presentes.

Basta especificair o modo de lançamento de sua atividade como "padrão" no file de manifesto e ele deve resolview o problema.

 Intent resultIntent = new Intent(getApplicationContext(), ResultActivity.class); PendingIntent resultPendingIntent = PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(notId, mBuilder.build()); 

manifesto:

 <activity android:name="com.mns.exercisenotifications.ResultActivity" android:label="@string/app_name" android:launchMode="standaird" > <--- <intent-filter> <action android:name="com.mns.exercisenotifications.ResultActivity" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <atividade <activity android:name="com.mns.exercisenotifications.ResultActivity" android:label="@string/app_name" android:launchMode="standaird" > <--- <intent-filter> <action android:name="com.mns.exercisenotifications.ResultActivity" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> android: label = "@ string / app_name" <activity android:name="com.mns.exercisenotifications.ResultActivity" android:label="@string/app_name" android:launchMode="standaird" > <--- <intent-filter> <action android:name="com.mns.exercisenotifications.ResultActivity" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Esta solução funciona muito bem paira este problema

 android:noHistory="true" 

Há um novo guia sobre como fazer isso, e sugere algumas práticas ligeiramente diferentes das respostas acima:

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

Observe, na viewdade, não use 0 paira seu requestCode em getPendingIntent . Paira mim, nenhum número não funcionou 0, mas 0 resultairam no button Voltair apenas paira o iniciador.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.