從通知啟動活動

當您透過通知啟動活動時,請務必保留使用者的 預期的導航體驗。輕觸「返回」按鈕必須讓使用者回到上一個畫面 從應用程式的正常工作流程前往主畫面,然後開啟「最近使用」 螢幕必須將活動顯示為獨立任務。保留此導覽 請在新工作中開始活動。

如需設定通知輕觸行為的基本方法,請參閱 建立基本方案 通知。 本頁說明如何設定 適用於你的 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()。 不過,在資訊清單中定義適當的工作選項。

  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. 建立 Intent,用來啟動 Activity
    2. Activity 設為在新的空白工作中啟動,方法是: 撥號中 setFlags() 並加上 FLAG_ACTIVITY_NEW_TASK 旗標 FLAG_ACTIVITY_CLEAR_TASK
    3. 透過呼叫建立 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
    );
    
  3. 照常將 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());
    

如要進一步瞭解各種工作選項以及返回堆疊的方式 請參閱工作與返回堆疊