Po rozpoczęciu aktywności z powiadomienia musisz zachować oczekiwane działanie nawigacji. Dotknięcie przycisku Wstecz musi spowodować przeniesienie użytkownika z powrotem przez standardowy przepływ pracy aplikacji na ekran główny i otwarcie karty Ostatnie. musi pokazywać aktywność jako osobne zadanie. Aby zachować tę nawigację rozpocznij aktywność w nowym zadaniu.
Podstawowe metody ustawiania działania związanego z dotknięciem powiadomienia opisano w sekcji
Utwórz podstawowy
.
Na tej stronie dowiesz się, jak skonfigurować
PendingIntent
dla
działania powiadomienia, aby utworzyć nowe zadanie i z powrotem
. Jak to zrobić
zależy od tego, jaki rodzaj aktywności rozpoczynasz:
- Standardowa aktywność
- To działanie, które występuje w ramach standardowego procesu korzystania z aplikacji. Kiedy użytkownik przechodzi do aktywności z powiadomienia, nowe zadanie musi Zawiera kompletny stos wsteczny, który umożliwia użytkownikowi nawigowanie po kliknięciu przycisku Wstecz w hierarchii aplikacji.
- Działanie specjalne
- Użytkownik widzi tę aktywność tylko wtedy, gdy została rozpoczęta z powiadomienia. W to działanie rozszerza interfejs powiadomień o informacje, które jest trudne do wyświetlenia w powiadomieniu. Ta aktywność nie wymaga stos wsteczny.
Skonfiguruj standardową intencję związaną z aktywnością PendingIntent
Aby rozpocząć standardową aktywność z poziomu powiadomienia, skonfiguruj PendingIntent
przy użyciu: TaskStackBuilder
aby utworzyć nowy stos wsteczny w następujący sposób.
Definiowanie hierarchii aktywności w aplikacji
Zdefiniuj naturalną hierarchię działań, dodając atrybuty
android:parentActivityName
do każdego atrybutu <activity>
w pliku manifestu aplikacji. Zobacz ten przykład:
<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> <!-- MainActivity is the parent for ResultActivity. --> <activity android:name=".ResultActivity" android:parentActivityName=".MainActivity" /> ... </activity>
Tworzenie intencji PendingIntent ze stosem wstecznym
Aby rozpocząć aktywność, która obejmuje kilka wcześniejszych działań, utwórz
wystąpienie TaskStackBuilder
i wywołanie
addNextIntentWithParentStack()
,
przekazując ją Intent
dla
aktywność, którą chcesz rozpocząć.
O ile zdefiniujesz aktywność nadrzędną dla każdej aktywności zgodnie z opisem
wcześniej, możesz zadzwonić
getPendingIntent()
otrzymasz PendingIntent
, który obejmuje cały tylny stos.
Kotlin
// Create an Intent for the activity you want to start. val resultIntent = Intent(this, ResultActivity::class.java) // Create the TaskStackBuilder. val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run { // Add the intent, which inflates the back stack. addNextIntentWithParentStack(resultIntent) // Get the PendingIntent containing the entire back stack. getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) }
Java
// Create an Intent for the activity you want to start. Intent resultIntent = new Intent(this, ResultActivity.class); // Create the TaskStackBuilder and add the intent, which inflates the back // stack. TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addNextIntentWithParentStack(resultIntent); // Get the PendingIntent containing the entire back stack. PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
W razie potrzeby możesz dodać argumenty do obiektów Intent
w stosie, wywołując
TaskStackBuilder.editIntentAt()
Niekiedy jest to niezbędne, aby aktywność w stosunku do tyłu
wyświetla istotne dane, gdy użytkownik przechodzi w jego kierunku.
Następnie możesz w zwykły sposób przekazać element PendingIntent
do powiadomienia:
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(resultPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Skonfiguruj specjalną aktywność PendingIntent
Ponieważ specjalne działanie, które rozpoczyna się od powiadomienia, nie wymaga cofania się.
można utworzyć PendingIntent
, wywołując
getActivity()
Określ jednak odpowiednie opcje zadań w pliku manifestu.
-
W pliku manifestu dodaj te atrybuty do pola
<activity>
element.-
android:taskAffinity=""
-
W połączeniu z
FLAG_ACTIVITY_NEW_TASK
używanej w kodzie, ustaw ten atrybut pusty, aby mieć pewność, ta aktywność nie wchodzi w skład domyślnego zadania aplikacji. Dowolne istniejące zadania z domyślną koligacją aplikacji nie są dotkniętych problemem. -
android:excludeFromRecents="true"
- Wyklucza nowe zadanie z ekranu Ostatnie, dzięki czemu użytkownik nie możesz przypadkowo wrócić do niej.
Widać to w tym przykładzie:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
-
-
Utwórz i wyślij powiadomienie:
-
Utwórz
Intent
, który zaczyna sięActivity
-
Skonfiguruj urządzenie
Activity
tak, aby rozpoczynało nowe, puste zadanie do połączeniasetFlags()
z flagamiFLAG_ACTIVITY_NEW_TASK
iFLAG_ACTIVITY_CLEAR_TASK
-
Utwórz
PendingIntent
, dzwoniącgetActivity()
Widać to w tym przykładzie:
Kotlin
val notifyIntent = Intent(this, ResultActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )
Java
Intent notifyIntent = new Intent(this, ResultActivity.class); // Set the Activity to start in a new, empty task. notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Create the PendingIntent. PendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
-
Utwórz
- Tak jak zwykle przekazujesz
PendingIntent
do powiadomienia:Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(notifyPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Więcej informacji o różnych opcjach zadań i sposobie łączenia wstecznego Więcej informacji znajdziesz w sekcji Lista zadań i tylny stos.