16

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

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

  2. 如果发送了一个意图,它什么时候被发送到一个新活动实例的 onCreate() 方法,什么时候通过一个现有活动的 onNewIntent() 方法被路由?

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

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

如果有人了解这一切,请帮助我!

4

2 回答 2

24
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如果已经存在活动实例并且不需要创建新实例,则调用它,例如singleInstancesingleTask并且有条件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);
}
于 2014-09-03T02:58:25.233 回答
0

最好的办法是阅读此处的开发者文档:http: //developer.android.com/training/basics/activity-lifecycle/index.html

第一课中有一个流程图(http://developer.android.com/images/training/basics/basic-lifecycle.png),它提供了Android活动生命周期的优秀图形表示。

于 2014-09-03T03:43:22.927 回答