What happens when you click on an app's launch icon?
启动器应用程序调用startActivity
具有意图 [action = Intent.ACTION_MAIN, category = Intent.CATEGORY_LAUNCHER 和 flag = Intent.FLAG_ACTIVITY_NEW_TASK]。
关于Intent.FLAG_ACTIVITY_NEW_TASK
,来自文档:
使用此标志时,如果您现在正在启动的 Activity 已经在运行任务,则不会启动新的 Activity;相反,当前任务将简单地以其上次所处的状态被带到屏幕的前面。
onNewIntent 基础知识:
onNewIntent
仅当活动设置了singleTask
启动singleInstance
模式时才交付。singleTop
如果活动已设置启动模式或启动活动的意图已设置标志FLAG_ACTIVITY_SINGLE_TOP
并且活动实例已位于目标任务的顶部,则它也会被传递。这意味着尝试启动一个新的活动实例,而不是现有实例本身需要处理意图。
以下是对您的查询的回复:
是否总是发送新的意图,或者结果有时与从最近的任务中恢复任务相同?
如果任务已在运行,则将其置于前台。如果 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
使用标志启动活动,然后将任务带到前台,则活动将被终止。来自文档:
这对于应用程序中存在逻辑中断的情况很有用。例如,一个电子邮件应用程序可能有一个查看附件的命令,该命令启动一个图像查看活动来显示它。此活动应该是电子邮件应用程序任务的一部分,因为它是用户参与的任务的一部分。但是,如果用户离开该任务,然后从家里选择电子邮件应用程序,我们可能会喜欢他们回到他们正在查看的对话,而不是图片附件,因为那会令人困惑。通过在启动图像查看器时设置此标志,该查看器及其启动的任何活动都将在用户下次返回邮件时被删除。
-
如果发送了一个意图,它什么时候被发送到一个新活动实例的 onCreate() 方法,什么时候通过一个现有活动的 onNewIntent() 方法被路由?
onCreate
在创建新的活动实例时调用。onNewIntent
如果已经存在活动实例并且不需要创建新实例,则调用它,例如singleInstance
,singleTask
并且有条件singleTop
地(如上所述)。
假设意图通过任务中现有活动的 onNewIntent() 进行路由。它被发送到哪个活动?离顶部最近的还是离根最近的?它总是会被发送到应用程序启动活动的实例,还是有时会被发送到与根具有相同亲和力的活动?它可以被发送到与根不具有相同亲和力的活动吗?
如果是singleTask
并且singleInstance
它必须是任务的根。如果singleTop
它必须是任务的顶级活动。
最后,这一切如何受到任务中活动的各种启动模式(标准、单顶、单实例、单任务)的影响?
我希望到目前为止提供的解释能够回答它。
更新1:
这是将标志添加到意图的启动器代码:
void processShortcut(Intent intent) {
....
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
....
}
void startActivitySafely(Intent intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
...
startActivity(intent);
}