在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
标志是必须的,它在通知处理方面究竟有什么不同呢?
答案 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 必须将活动启动到另一个任务中。