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,来自docs:
当使用这个标志时,如果一个任务已经在为这个活动运行
您现在正在开始,则不会开始新的活动;
相反,当前任务将简单地被带到前面
屏幕上的状态。
onNewIntent 基础知识:
onNewIntent 仅在活动设置了singleTask、singleInstance 启动模式时才会传递。如果活动设置了singleTop 启动模式或启动活动的意图设置了标志FLAG_ACTIVITY_SINGLE_TOP 并且活动实例已经位于目标任务的顶部,它也会被传递。这意味着尝试启动新的活动实例,而不是现有实例本身需要处理意图。
以下是对您的询问的回复:
是否总是发送新的意图,或者结果有时与
从最近的任务中恢复任务?
如果任务已在运行,则将其置于前台。如果FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 标志被用来启动一个活动,然后任务被带到前台,那么这个活动就会被杀死。来自docs:
这对于您的逻辑中断的情况很有用
应用。例如,一个电子邮件应用程序可能有一个命令
查看附件,它会启动要显示的图像查看活动
它。此活动应该是电子邮件应用程序任务的一部分,
因为它是用户参与的任务的一部分。但是,如果
用户离开该任务,然后从家里选择电子邮件应用程序,
我们可能希望他们回到他们正在查看的对话,而不是
图片附件,因为这令人困惑。通过设置此标志
启动图像查看器时,该查看器及其任何活动
下次用户返回邮件时将删除starts。
-
如果一个意图被发送,它什么时候被发送到 onCreate() 方法
一个新的活动实例,它什么时候被路由通过
现有活动的 onNewIntent()?
onCreate 在创建新的活动实例时被调用。如果已经存在活动实例并且不需要创建新实例,则调用 onNewIntent,例如 singleInstance、singleTask 和有条件的 singleTop(如上所述)。
假设意图通过 onNewIntent() 路由
任务中的现有活动。它被发送到哪个活动?这
离顶部最近的还是离根最近的?会不会一直得到
发送到应用程序启动活动的实例,或者它可以
有时会被发送到与根具有相同亲和力的活动?
它可以发送到不共享相同的活动吗
亲和为根?
如果是singleTask 和singleInstance,它必须是任务的根。对于singleTop,它必须是任务的最高活动。
最后,这一切如何受到各种启动模式的影响
(标准、单顶、单实例、单任务)的活动
在任务中?
我希望到目前为止提供的解释,回答它。
更新 1:
这是将标志添加到意图的Launcher 代码:
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);
}