单击应用程序的启动图标会发生什么?

Pau*_*ton 12 android android-activity android-task

 单击应用程序的启动图标会发生什么?

  1. 是否始终发送新意图,或者结果有时与从最近任务恢复任务相同?

  2. 如果发送了intent,它何时被发送到新活动实例的onCreate()方法,何时通过现有活动的onNewIntent()进行路由?

  3. 让我们假设意图通过任务中现有活动的onNewIntent()进行路由.它被发送到哪个活动?最靠近顶部的那个或最靠近根的那个?它是否总是被发送到应用程序的启动活动的实例,或者它有时会被发送到与根目录具有相同亲和力的活动吗?它是否可以被发送到与根不具有相同亲和力的活动?

  4. 最后,这一切是如何受到任务中各种活动的各种启动模式(标准,单顶,单实例,单一任务)的影响?

如果有人知道这一切,请帮助我!

Man*_*ani 12

What happens when you click on an app's launch icon?
Run Code Online (Sandbox Code Playgroud)

Launcher应用程序调用startActivityintent [action = Intent.ACTION_MAIN,category = Intent.CATEGORY_LAUNCHER and 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:

这对于应用程序中存在逻辑中断的情况很有用.例如,电子邮件应用程序可以具有查看附件的命令,该附件启动图像视图活动以显示它.此活动应该是电子邮件应用程序任务的一部分,因为它是用户参与的任务的一部分.但是,如果用户离开该任务,并且稍后从家中选择电子邮件应用程序,我们可能会喜欢他们回到他们正在观看的对话,而不是图片附件,因为那令人困惑.通过在启动图像查看器时设置此标志,下次用户返回邮件时将删除该查看器及其启动的任何活动.

-

如果发送了intent,它何时被发送到新活动实例的onCreate()方法,何时通过现有活动的onNewIntent()进行路由?

onCreate在创建新的活动实例时调用.onNewIntent如果已经活动实例存在,并且没有新的实例需要被创建,如在的情况下,被称为singleInstance,singleTask并有条件地singleTop(如上所述).

让我们假设意图通过任务中现有活动的onNewIntent()进行路由.它被发送到哪个活动?最靠近顶部的那个或最靠近根的那个?它是否总是被发送到应用程序的启动活动的实例,或者它有时会被发送到与根目录具有相同亲和力的活动吗?它是否可以被发送到与根不具有相同亲和力的活动?

如果是singleTask,singleInstance它必须是任务的根.如果singleTop它必须是任务的最高活动.

最后,这一切是如何受到任务中各种活动的各种启动模式(标准,单顶,单实例,单一任务)的影响?

我希望到目前为止提供的解释能够得到答案.

更新1:

这是Launcher代码,它将标志添加到intent:

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);
}
Run Code Online (Sandbox Code Playgroud)