Rozpoczynanie aktywności z powiadomienia

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.

  1. 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>
    
  2. Utwórz i wyślij powiadomienie:
    1. Utwórz Intent, który zaczyna się Activity
    2. Skonfiguruj urządzenie Activity tak, aby rozpoczynało nowe, puste zadanie do połączenia setFlags() z flagami FLAG_ACTIVITY_NEW_TASK i FLAG_ACTIVITY_CLEAR_TASK
    3. Utwórz PendingIntent, dzwoniąc getActivity()

    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
    );
    
  3. 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.