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

时间:2014-08-31 18:19:40

标签: android android-activity android-task

点击应用的启动图标后会发生什么?

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

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

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

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

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

2 个答案:

答案 0 :(得分:11)

What happens when you click on an app's launch icon?

Launcher应用程序使用intent [action = Intent.ACTION_MAIN,category = Intent.CATEGORY_LAUNCHER和flag = Intent.FLAG_ACTIVITY_NEW_TASK]调用startActivity

关于Intent.FLAG_ACTIVITY_NEW_TASK,来自docs

  

使用此标志时,如果某个任务已在运行该活动   你现在开始,然后一个新的活动将不会开始;   相反,当前的任务将被简单地带到前面   屏幕显示它最后的状态。

onNewIntent基础知识:

仅当活动设置onNewIntentsingleTask启动模式时,

singleInstance才会发送。如果活动已设置singleTop启动模式或启动活动的意图已设置标志FLAG_ACTIVITY_SINGLE_TOP且活动实例已位于目标任务的顶部,则也会传递它。这意味着尝试启动一个新的活动实例,而现有实例本身需要处理意图。

以下是对您的查询的回复:

  

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

如果任务已在运行,则将其置于前台。如果FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标志用于启动活动,后者将任务带到前台,则活动将被终止。来自docs

  

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

-

  

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

在创建新的活动实例时调用

onCreate。如果已存在活动实例并且不需要创建新实例,则会调用onNewIntent,例如singleInstancesingleTask和有条件singleTop(如上所述)。

  

让我们假设意图通过onNewIntent()来路由   任务中的现有活动。它被发送到哪个活动?该   最靠近顶部的一个或最靠近根的一个?它会永远得到吗?   发送到应用程序的启动活动的实例或者它可以   有时会发送到与root具有相同亲和力的活动?   它是否可以被发送到不共享相同的活动   亲和力作为根?

如果是singleTasksingleInstance,则必须是任务的根。在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);
}

答案 1 :(得分:0)

您最好的选择是阅读开发者文档:http://developer.android.com/training/basics/activity-lifecycle/index.html

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