Android通知:需要Intent.FLAG_ACTIVITY_NEW_TASK吗?

时间:2015-06-17 08:47:50

标签: android android-intent notifications

Notification课程的文件中,我看到了这一点:

  

public PendingIntent contentIntent

     

单击展开状态条目时执行的意图。如果这是一项活动,则必须包含FLAG_ACTIVITY_NEW_TASK标志,这需要您按照Tasks and Back Stack文档中的说明处理任务管理。特别是,请务必阅读通知部分Handling Notifications,了解从通知启动应用程序的正确方法。

我已经阅读了上面链接的资料,但我仍然没有得到它。为什么在单击通知时启动活动时需要FLAG_ACTIVITY_NEW_TASK标志?我尝试了以下代码:

NotificationManager manager = (NotificationManager)context.
    getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(
    android.R.drawable.stat_notify_sync, title,
    System.currentTimeMillis());
notification.flags |= Notification.FLAG_AUTO_CANCEL;
Intent intent = new Intent(context, NotifiedActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  // IS THIS REALLY REQUIRED??
PendingIntent pt = PendingIntent.getActivity(context, 0, intent, 0);
notification.setLatestEventInfo(context, title, text, pt);
manager.notify(0, notification);

我运行上面的代码,无论是否有intent.setFlags行,似乎都没有区别。实际上,我发现的许多代码示例都没有这一行。那么为什么文档说FLAG_ACTIVITY_NEW_TASK标志是必须的,它在通知处理方面究竟有什么不同呢?

1 个答案:

答案 0 :(得分:13)

从技术上讲,此标志是必需的。但由于它是必需的,Android很好,只会为你设置它; - )

需要的原因如下:

处理Notification并调用startActivity()以实际启动Intent的代码未在“任务”中运行。它是系统代码,是Notification系统的一部分。通常情况下,如果您拨打startActivity()并且标记Intent.FLAG_ACTIVITY_NEW_TASK 未设置,则Android会尝试将该活动启动到当前任务中(即:包含活动的任务打电话给startActivity())。因为,在这种情况下,没有任务,Android 必须将Activity启动到另一个任务中。这就是您需要指定Intent.FLAG_ACTIVITY_NEW_TASK

的原因

在实践中,这并不总是会创建新任务,因为Android会首先尝试找到(合适的)现有任务来启动Activity。如果您的应用已在运行,Android会将活动启动到该任务中。 (这不是100%正确,还有其他特殊情况可以改变这种逻辑,但我不打算在这里解决它们。)

注意:如果您从startActivity()Service致电BroadcastReceiver,则存在相同的情况。在这些情况下,必须设置标记Intent.FLAG_ACTIVITY_NEW_TASK ,因为没有“当前任务”,因此Android 必须将活动启动到另一个任务中。