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