從通知啟動活動

從通知啟動活動時,您必須保留使用者預期的導覽體驗。輕觸「返回」按鈕時,必須讓使用者透過應用程式的正常工作流程返回主畫面,且開啟「最近使用的應用程式」畫面時,必須將活動顯示為個別工作。如要保留這項導覽體驗,請在新工作中啟動活動。

如要設定通知的輕觸行為,基本方法請參閱「建立基本通知」。本頁說明如何為通知動作設定PendingIntent,以便建立新的工作和返回堆疊。具體做法取決於您要啟動的活動類型:

  • 一般活動:這類活動是應用程式正常使用者體驗流程的一部分。使用者從通知抵達活動時,新工作必須包含完整的返回堆疊,讓使用者輕觸「返回」按鈕,即可在應用程式階層中向上瀏覽。
  • 特殊活動:使用者必須從通知啟動這項活動,才會看到。從某種意義上來說,這項活動會提供難以在通知本身顯示的資訊,藉此擴充通知 UI。這項活動不需要返回堆疊。

設定一般活動 PendingIntent

如要從通知啟動一般活動,請使用 TaskStackBuilder 設定 PendingIntent,以便建立新的返回堆疊,如下所示。

定義應用程式的 Activity 層級

在應用程式資訊清單檔案中,為每個 <activity> 元素新增 android:parentActivityName 屬性,定義活動的自然階層。請參閱以下範例:

<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>

使用返回堆疊建構 PendingIntent

如要啟動包含活動返回堆疊的活動,請建立 TaskStackBuilder 的例項並呼叫 addNextIntentWithParentStack(),然後將要啟動的活動 Intent 傳遞至該例項。

只要為每個活動定義父項活動 (如先前所述),即可呼叫 getPendingIntent() 來接收包含整個返回堆疊的 PendingIntent。

// 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
    )
}

如有需要,您可以在堆疊中呼叫 TaskStackBuilder.editIntentAt(),將引數新增至 Intent 物件。有時必須這麼做,才能確保使用者導覽至返回堆疊中的活動時,系統會顯示有意義的資料。

然後照常將 PendingIntent 傳遞至通知:

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentIntent(resultPendingIntent)
    // ...
}
with(NotificationManagerCompat.from(this)) {
    notify(NOTIFICATION_ID, builder.build())
}

設定特殊活動 PendingIntent

因為從通知啟動的特殊活動不需要返回堆疊,所以您可以呼叫 getActivity() 來建立 PendingIntent。不過,請在資訊清單中定義適當的工作選項。

  1. 在資訊清單中,將下列屬性新增至 <activity> 元素。

    android:taskAffinity=""
    搭配您在程式碼中使用的 FLAG_ACTIVITY_NEW_TASK 標記,將這項屬性設為空白,確保這個活動不會進入應用程式的預設工作。應用程式預設親和性不會影響任何現有工作。
    android:excludeFromRecents="true"
    從「最近使用」畫面排除新工作,避免使用者意外返回。

    例如:

    <activity
    android:name=".ResultActivity"
    android:launchMode="singleTask"
    android:taskAffinity=""
    android:excludeFromRecents="true">
    </activity>

  2. 建構及發布通知:

    1. 建立啟動 Activity 的 Intent。
    2. 呼叫 setFlags() 並傳入 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 旗標,將 Activity 設為在新空白工作啟動。
    3. 呼叫 getActivity() 即可建立 PendingIntent。

    例如:

    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
    )

  3. 照常將 PendingIntent 傳遞至通知:

    val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
        setContentIntent(notifyPendingIntent)
        // ...
    }
    with(NotificationManagerCompat.from(this)) {
        notify(NOTIFICATION_ID, builder.build())
    }

如要進一步瞭解各種工作選項和返回堆疊的運作方式,請參閱「工作和返回堆疊」。