當您透過通知啟動活動時,請務必保留使用者的 預期的導航體驗。輕觸「返回」按鈕必須讓使用者回到上一個畫面 從應用程式的正常工作流程前往主畫面,然後開啟「最近使用」 螢幕必須將活動顯示為獨立任務。保留此導覽 請在新工作中開始活動。
如需設定通知輕觸行為的基本方法,請參閱
建立基本方案
通知。
本頁說明如何設定
適用於你的 PendingIntent
藉此建立全新工作
堆疊。做法
取決於您要開始的活動類型:
- 規律活動
- 這項活動屬於應用程式正常使用者體驗流程的一部分。時間 而使用者透過通知進入活動時,新任務必須 加入完整的返回堆疊,讓使用者輕觸「返回」按鈕即可瀏覽 。
- 特殊活動
- 使用者只會看到透過通知啟動的活動。在 這個活動會延伸通知 UI,方法是提供 難以在通知內顯示這項活動不需要 返回堆疊。
設定一般活動 PendingIntent
如要從通知開始定期活動,請設定 PendingIntent
使用 TaskStackBuilder
建立新的返回堆疊,如下所示。
定義應用程式的活動階層
將
android:parentActivityName
敬上
歸因於每個 <activity>
元素。請參閱以下範例:
<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
。
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);
如有需要,您可以呼叫以下程式碼,將引數新增至堆疊中的 Intent
物件
TaskStackBuilder.editIntentAt()
。
有時這是要確保返回堆疊中的活動
能在使用者瀏覽時,顯示有意義的資料。
接著,您可以照常將 PendingIntent
傳遞至通知:
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());
設定特殊活動的 PendingIntent
因為從通知開始的特殊活動不需要返回
您可以藉由呼叫PendingIntent
getActivity()
。
不過,在資訊清單中定義適當的工作選項。
-
在您的資訊清單中,將下列屬性新增至
<activity>
元素。-
android:taskAffinity=""
-
與
FLAG_ACTIVITY_NEW_TASK
標記您在程式碼中 請將這個屬性設為空白 這項活動不會納入應用程式的預設任務。不限 不符合應用程式預設相依性的現有工作 可能會受到影響 -
android:excludeFromRecents="true"
- 將新工作從「最近使用」畫面中排除,以便使用者 避免不小心回到該畫面
例如:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
-
-
建構並發出通知:
-
建立
Intent
,用來啟動Activity
。 -
將
Activity
設為在新的空白工作中啟動,方法是: 撥號中setFlags()
並加上FLAG_ACTIVITY_NEW_TASK
旗標FLAG_ACTIVITY_CLEAR_TASK
。 -
透過呼叫建立
PendingIntent
getActivity()
。
例如:
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 );
-
建立
- 照常將
PendingIntent
傳遞至通知: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());
如要進一步瞭解各種工作選項以及返回堆疊的方式 請參閱工作與返回堆疊。