2011-08-18 11 views
18

mam dwa rodzaje działalności:Jak zbudować stos systemu operacyjnego Android, gdy aktywność rozpoczyna się bezpośrednio od powiadomienia?

aktywny A - listę elementów
Działalność B - szczegółowy widok elementu

Normalnie, użytkownik otwiera aplikację i aktywny A jest uruchomiony. Użytkownik widzi listę przedmiotów, klika jeden i rozpoczyna się działanie B, aby wyświetlić szczegóły przedmiotu.

Aktywność B można również uruchomić bezpośrednio po kliknięciu powiadomienia. W tym przypadku nie ma tylnego stosu.

Jak mogę to zrobić, aby po uruchomieniu Aktywności B bezpośrednio z powiadomienia użytkownik mógł kliknąć przycisk Wstecz i przejść do Czynności A?

+0

nigdy nie będąc do t jego sytuacja, więc moja odpowiedź może nie być doskonała. Zamiast uruchamiać działanie B ... Rozpocznij działanie A i podaj wartość za pomocą funkcji Intent z odbiornika i sprawdź tę wartość w polu Utwórz działanie A, jeśli warunek spełnia działanie B.Tak więc dzięki temu będziesz mieć działanie A w backStack. Ale tylko złapać, że użytkownik zobaczy dziwne animacje, takie jak działanie A i przejście do działania B. Czy to ma sens? – Gopal

+0

@gopal tak rozważałem wdrożenie czegoś takiego. Wypróbuję to wkrótce i zdam raport. –

+0

na pewno daj mi znać – Gopal

Odpowiedz

22

Możesz dodać dodatkowy do intencyjny zainicjowanej przez notyfikacji do wykrycia, gdy aplikacja została uruchomiona w ten sposób.

Następnie można zastąpić metodę działania onBackPressed() i obsłużyć ten scenariusz, np.

@Override 
    public void onBackPressed() 
    { 
    Bundle extras = getIntent().getExtras(); 

    boolean launchedFromNotif = false; 

    if (extras.containsKey("EXTRA_LAUNCHED_BY_NOTIFICATION")) 
    { 
     launchedFromNotif = extras.getBoolean("EXTRA_LAUNCHED_BY_NOTIFICATION"); 
    } 

    if (launchedFromNotif) 
    { 
     // Launched from notification, handle as special case 
     Intent intent = new Intent(this, ActivityA.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     mActivity.startActivity(intent); 
     finish(); 
    } 
    else 
    { 
     super.onBackPressed(); 
    }  
    } 
+0

1up, ponieważ to rozwiązanie jest niezależne od poziomu api, w przeciwieństwie do rozwiązania PendingIntent.getActivities() (http://stackoverflow.com/a/13801159/1894568) – AndacAydin

+0

Sprawdź, czy pakiet "dodatki" nie ma wartości "null" potrzebne przed uzyskaniem dostępu. – Joe

+0

@AndacAydin Co masz na myśli przez "PendingIntent.getActivities() zależy od poziomu API"? Jak wskazuje Cassio Landim, polecam rozwiązanie "TaskStackBuilder", edytując backStack, zgodnie z wytycznymi. – John

0

przechwycić zdarzenie klawisza powrotu za pomocą metody onKeyDown() - i pozwolić użytkownikowi przejść do działania A. Nie zapomnij zwrócić wartość true, aby zapobiec dalszemu propagowaniu zdarzenia.

http://developer.android.com/reference/android/app/Activity.html#onKeyDown(int, android.view.KeyEvent)

+0

Przez "pozwól użytkownikowi przejść do działania A", masz na myśli stworzenie intencji i rozpoczęcie działalności A? Gdybym to zrobił, a użytkownik wcisnął przycisk Wstecz w Aktywności A, wróciliby do Aktywności B, prawda? –

+0

tak, to prawda. Jeśli chcesz temu zapobiec, spróbuj zakończyć swoją aktywność B po rozpoczęciu działania A, tzn .: Intent i = new Intent (this, ActivityA.class); startActivity (i); Zakończ(); – AZ13

5

Należy dbać o to, kiedy otrzymasz powiadomienie.

mam podobna sytuacja rozwiązany:

Intent intent = new Intent(context,ListDetail.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addParentStack(ListDetail.class); 
stackBuilder.addNextIntent(intent); 
PendingIntent contentIntent = 
      stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
Notification.Builder mBuilder = new Notification.Builder(context); 
mNotifM.notify(NotificationId.getID(), mBuilder.setStyle(new Notification.BigTextStyle(mBuilder) 
      .bigText(bigText) 
      .setBigContentTitle(title) 
      .setSummaryText(summaryText)) 
      .setContentTitle(title) 
      .setSmallIcon(icon) 
      .setContentText(summaryText) 
      .setAutoCancel(true) 
      .setContentIntent(contentIntent) 
      .setTicker(bigText) 
      .build()); 

trzeba ustawić w swoim manifeście hierarchię DZIAŁALNOŚCI:

<activity 
     android:name=".ListDetail" 
     android:label="Detail" 
     android:parentActivityName=".List" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".List" /> 
</activity> 
2

Próbowałem jednego sample.Please przejść z tego linku

https://github.com/rajajawahar/NotificationBackStack 

aktywny chcesz uruchomić ..

Intent launchIntent = new Intent(context, SecondActivity.class).putExtra("Id", id); 

Rodzic aktywny, jeśli z powrotem wciśnięty

Intent parentIntent = new Intent(context, FirstActivity.class); 

dodać obie aktywności w taskbuilder

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    PendingIntent resultPendingIntent = stackBuilder.addNextIntentWithParentStack(parentIntent).addNextIntent(launchIntent).getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder notificationCompatBuilder = 
       new NotificationCompat.Builder(context); 
     NotificationManager mNotificationManager = 
       (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(id, notificationCompatBuilder.build()); 
     NotificationManager mNotifyMgr = 
       (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationCompatBuilder.setAutoCancel(true). 
       setContentTitle("First Notification"). 
       setContentText("Sample Text"). 
       setSmallIcon(R.mipmap.ic_launcher). 
       setContentIntent(resultPendingIntent); 
     mNotifyMgr.notify(id, notificationCompatBuilder.build()); 
Powiązane problemy