從通知啟動活動時,您必須保留使用者預期的導覽體驗。輕觸「返回」按鈕時,必須讓使用者透過應用程式的正常工作流程返回主畫面,且開啟「最近使用的應用程式」畫面時,必須將活動顯示為個別工作。如要保留這項導覽體驗,請在新工作中啟動活動。
如要設定通知的輕觸行為,基本方法請參閱「建立基本通知」。本頁說明如何為通知動作設定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。不過,請在資訊清單中定義適當的工作選項。
在資訊清單中,將下列屬性新增至
<activity>元素。android:taskAffinity=""- 搭配您在程式碼中使用的
FLAG_ACTIVITY_NEW_TASK標記,將這項屬性設為空白,確保這個活動不會進入應用程式的預設工作。應用程式預設親和性不會影響任何現有工作。 android:excludeFromRecents="true"- 從「最近使用」畫面排除新工作,避免使用者意外返回。
例如:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
建構及發布通知:
- 建立啟動
Activity的Intent。 - 呼叫
setFlags()並傳入FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TASK旗標,將Activity設為在新空白工作啟動。 - 呼叫
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 )
- 建立啟動
照常將
PendingIntent傳遞至通知:val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
如要進一步瞭解各種工作選項和返回堆疊的運作方式,請參閱「工作和返回堆疊」。