2012-12-10 10 views
21

Próbuję zaimplementować zachowanie opisane here, gdzie powiadomienie (lub coś podobnego) rozpoczyna "wewnętrzną" aktywność w aplikacji, a następnie po naciśnięciu klawisza cofa moja aktywność "domowa".Powrót do głównej aktywności z działań związanych z tworzeniem powiadomień

Android docs powiedzieć

W przypadku przycisku Wstecz, należy dokonać nawigacji więcej przewidywalne przez wstawienie do tyłu zadaniem jest stos kompletny wzrostową ścieżkę nawigacji do aplikacji najwyższej ekranie. Dzięki temu użytkownicy, którzy nie pamiętają, jak wkroczyli do Twojej aplikacji, przechodzą na najwyższy ekran aplikacji przed jej zamknięciem, .

Czy istnieje dobry sposób, aby to zrobić? Inne pytania dotyczące Stackoverflow sugerują rozpoczęcie głównej aktywności z intencją, która mówi jej o rozpoczęciu wewnętrznej aktywności, ale wydaje się, że jest to wielki hack, że nieco wątpię, że Google użyłoby go w Gmailu i zakładam, że jest przyzwoita metoda, biorąc pod uwagę że opowiadają się za zachowaniem.

Czy istnieje nie-hacky sposób to zrobić?

Odpowiedz

55

Aha, po prostu potrzebuję użyć PendingIntent.getActivities() zamiast getActivity(). Warto również wspomnieć, TaskStackBuilder

Oto kod:

Intent backIntent = new Intent(ctx, MainActivity.class); 
    backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Intent intent = new Intent(ctx, ConversationActivity.class); 
    intent.putExtra("whatever", whatever); 
    final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++, 
      new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT); 

Wystarczy go testowane. To działa jak urok. Początkowo podejrzewałem, że może być problem, jeśli aplikacja jest już uruchomiona, a Ty przejdziesz do powiadomienia. To znaczy. powiedzieć ci stos jest aktywność (najwyższy po prawej):

[MainActivity] [SomeActivity] 

i kliknięciu powiadomienia o ConversationActivity. Czy dostaniesz:?

[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity] 

Cóż, okaże się, że w magiczny sposób dostać

[MainActivity] [SomeActivity] [ConversationActivity] 

co jest to, co chciałem, ale nie mam pojęcia jak to się robi. Nie ustawiłem żadnych specjalnych opcji w żadnej z czynności. No cóż!

+0

Niestety, to nie wydaje się działać dla mnie. Moja MainActivity rzeczywiście zostaje ponownie wciśnięta na stos nawigacyjny i działa tylko jeden raz na jedno powiadomienie (nie odrzucam ich automatycznie). Jakieś pomysły? – bompf

+1

@bompf, prawdopodobnie z powodu 'PendingIntent.FLAG_ONE_SHOT' używanego w' PendingIntent.getActivities'. Zamiast tego sugeruję 'PendingIntent.FLAG_CANCEL_CURRENT'. – Sam

+1

Dzięki; to działało dla mnie, podczas gdy 'TaskStackBuilder' nie działało. Jednak Twój kod spowodował dziwny stan: jeśli otworzyłem 'MainActivity' przez launcher, a następnie otworzyłem akcję z powiadomienia, po naciśnięciu przycisku Back, aby wrócić do" MainActivity ", naciśnięcie przycisku back spowodowało, że "MainActivity" ponownie. W ten sposób: '[MainActivity] [MainActivity] [ConversationActivity]'. Naprawiłem to, zmieniając twój drugi wiersz kodu na 'backIntent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK)'. – Sam

1

znam 2 sposoby osiągnięcia tego celu:

  1. rozpocząć swoją home activity od wewnątrz działalność rozpoczęła w drodze notyfikacji. Może to stać się dość trudne, ponieważ będziesz musiał rozróżnić i śledzić różne możliwe punkty wejścia.
  2. Zawsze zaczynasz od siebie home activity, który sprawdza, czy jest uruchamiany przez powiadomienie, a następnie uruchamia notification activity. Zapewnia to spójny punkt wejścia, a tylny stos będzie tam, gdy użytkownik naciśnie klawisz w górę.

Pozdrawiam.

0

Nice.

Należy jednak pamiętać, że nie działa on w wersji przed 3.System 0 (pre API level 11), ponieważ PendingIntent.getActivities() nie jest tam dostępny.

To samo dotyczy skonstruowania backstacku, aby uzyskać dostęp do działania z powiadomienia (za pomocą funkcji Intent) i przycisk wstecz zachowuje się spójnie z aplikacją (na przykład aktywność szczegółów wraca do działania na liście).

0

Aktywności są powiązane z zadaniem, które jest niczym innym, jak grupą działań w tylnym stosie. Po otwarciu nowej aktywności po kliknięciu powiadomienia, działanie to zostaje otwarte jako niezależne działanie i zostaje przeniesione do nowego zadania. Oznacza to tylko aktywność powiadamiania i aktywność nadrzędną.

Po prostu określ tryb uruchamiania swojej aktywności jako "standard" w pliku manifestu, który powinien rozwiązać problem.

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()); 

oczywisty:

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

</activity> 
0

To rozwiązanie działa świetnie dokładnie tego problemu

android:noHistory="true" 
Powiązane problemy