从通知启动 Activity

从通知启动 Activity 时,您必须保留用户的 用户的预期导航体验点按“返回”按钮必须让用户返回 从应用的正常工作流转到主屏幕,以及打开“最近使用的应用” 必须将 activity 显示为单独的任务。保留此导航 请在全新任务中启动 activity。

下文介绍了设置通知点按行为的基本方法 创建基本 通知。 本页介绍了如何设置 PendingIntent,您的 通知的操作,因此它会创建新任务,并返回 堆栈。具体做法 取决于您要启动的 activity 类型:

常规 Activity
这类 Activity 是应用的正常用户体验流程的一部分。时间 当用户从通知到达 activity 时,新任务必须 包含完整的返回堆栈,让用户能够通过点按“返回”按钮进行导航 应用层次结构的更上层。
特殊 Activity
只有当 Activity 从通知启动时,用户才可以看到此类 Activity。在 此 activity 通过提供 很难显示在通知本身中此活动不需要 返回堆栈。

设置常规 Activity PendingIntent

如需从通知中启动常规 activity,请设置 PendingIntent 使用TaskStackBuilder 以便创建新的返回堆栈,如下所示。

定义应用的 Activity 层次结构

通过添加 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

如需启动包含 activity 返回堆栈的 activity,请创建一个 TaskStackBuilder 的实例并调用 addNextIntentWithParentStack(), 将 Intent 传递给 您想要启动的 activity。

只要按照说明为每个 activity 定义父 activity 您可以调用 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()。 有时需要这样做,以确保返回堆栈中的 activity 在用户导航到时显示有意义的数据。

然后,您可以像往常一样将 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());

设置特殊 Activity PendingIntent

因为从通知启动的特殊 activity 不需要返回 您可以调用 PendingIntent 来创建 getActivity()。 不过,请在清单中定义适当的任务选项。

  1. 在清单中,将以下属性添加到 <activity> 元素。
    android:taskAffinity=""
    FLAG_ACTIVITY_NEW_TASK 标记,请将此属性留空,以确保 此 activity 不会进入应用的默认任务。不限 具有应用默认相似性的现有任务不会 。
    android:excludeFromRecents="true"
    将新任务从“最近使用的应用”屏幕中排除,以便用户 就无法意外地返回至该网域

    具体可见以下示例:

    <activity
        android:name=".ResultActivity"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    
  2. 构建并发出通知: <ph type="x-smartling-placeholder">
      </ph>
    1. 创建一个 Intent,用于启动 Activity
    2. Activity 设置为在新的空任务中启动,具体方法如下: 呼叫 setFlags() 使用标记FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK
    3. 通过调用以下方法来创建 PendingIntentgetActivity()

    具体可见以下示例:

    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());
    

如需详细了解各种任务选项以及返回堆栈的方式 请参见任务和返回堆栈