Launcher桌面点击图标如何启动应用

源码版本:android15

Launcher3目录下ItemClickHandler类负责图标点击响应

ItemClickHandler.java:

private static void startAppShortcutOrInfoActivity(View v, ItemInfo item, Launcher launcher) {

。。。。。。

launcher.startActivitySafely(v, intent, item);

}

Launcher.java

public RunnableListstartActivitySafely(View v, Intent intent, ItemInfo item){

。。。。。。

RunnableList result =super.startActivitySafely(v, intent, item);

//super是Launcher3包下得ActivityContext类

}

ActivityContext.java:

default RunnableListstartActivitySafely(View v, Intent intent,@Nullable ItemInfo item) {

。。。。。。

context.startActivity(intent, optsBundle); //Context上下文了

}

我们来Activity中看一下

Activity.java:

调用到了startActivityForResult

最后是调用到了Instrumentation类,主要负责调用跟踪Activity和Application的生命周期,方法中还包括了mMainThread.sendActivityResult的调用,mMainThread是ActivityThread对象。Activity在attach时ActivityThread就把自己传给了Activity,因此每个Activity都有ActivityThread,ActivityThread是app的主线程,包含了app所有activity状态。

继续追踪Instrumentationll类

Instrumentationll.java:

mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, who,

intent, requestCode, options); //启动Activity

execStartActivity方法:

两个点:

第一个点,ActivityMonitors 监视Activity 

另一个点,通过ActivityTaskManager获取服务,startActivity

whoThread是IApplicationThread类,在ActivityThread类中会创建ApplicationThread类,此类是AMS使用Binder跨进程通信时利用ApplicationThread当作传输桥梁。ApplicationThread是一个AIDL形式

继续看ActivityTaskManager源码:

可以看出来IActivityTaskManager类是AMS服务的aidl类(ServiceManager.getService获取AMS服务),不熟悉Binder跨进程通信的可以看后续文章讲解。

ActivityTaskManagerService.java

startActivityAsUser方法:

getActivityStartController.java返回的是ActivityStartController.java类,obtainStarter返回的是

ActivityStartController.java

咱们继续爬代码,ActivityStarter.java的execute(),其注释为:

Resolve necessary information according the request parameters provided earlier, and execute the request which begin the journey of starting an activity. @return The starter result.

根据前面提供的请求参数解析必要的信息,并执行开始活动启动之旅的请求@return起始结果。

执行到executeRequest方法,其注释:

Executing activity start request and starts the journey of starting an activity. Here begins with performing several preliminary checks. The normally activity launch flow will go through {@link #startActivityUnchecked} to {@link #startActivityInner}.

执行活动启动请求并开始启动活动的旅程。这里从执行几个初步检查开始。正常的活动启动流程将经过{@link#startActivityUnchecked}到{@link#startActivityInner}。



在阅读代码过程中看到ActivityTaskSupervisor类:

ActivityTaskSupervisor的主要功能包括:

管理任务栈:ActivityTaskSupervisor维护了一个任务栈列表,每个任务栈包含多个Activity实例。它负责创建、销毁和管理任务栈,以及处理任务栈之间的切换。

启动Activity:当启动一个新的Activity时,ActivityTaskSupervisor负责确定Activity所属的任务栈,并将其添加到相应的任务栈中。它还会处理Activity的启动模式,如singleInstance、singleTask和singleTop等。

切换Activity:当用户切换到另一个Activity时,ActivityTaskSupervisor负责将当前Activity置于后台,并将目标Activity置于前台。它还会处理Activity的切换动画和生命周期回调。

关闭Activity:当关闭一个Activity时,ActivityTaskSupervisor负责从任务栈中移除该Activity,并根据需要销毁任务栈。它还会处理Activity的关闭动画和生命周期回调。

任务栈调度:ActivityTaskSupervisor根据一定的策略和优先级,对任务栈进行调度和管理。它可以根据任务栈的优先级、任务栈中Activity的状态等因素,决定哪个任务栈处于前台,哪个任务栈处于后台。



继续看代码,executeRequest方法根据注释会走到startActivityUnchecked

startActivityUnchecked方法中会执行到startActivityInner方法,result是执行结果,startActivityUnchecked方法注释:

Start an activity while most of preliminary checks has been done and caller has been

* confirmed that holds necessary permissions to do so.

* Here also ensures that the starting activity is removed if the start wasn't successful.

在完成大部分初步检查并确认呼叫者拥有必要权限的情况下启动活动。如果启动不成功,这里还可以确保删除启动活动。

startActivityInner方法,其注释:

Start an activity and determine if the activity should be adding to the top of an existing task or delivered new intent to an existing activity. Also manipulating the activity task onto requested or valid root-task/display.

Note: This method should only be called from {@link #startActivityUnchecked}.

启动一个活动,并确定该活动是应该添加到现有任务的顶部,还是应该向现有活动传递新的意图。还将活动任务操纵到请求的或有效的根任务/显示上。

注意:此方法只能从{@link#startActivityUnchecked}调用。

此方法中也判断了Task栈情况。

接着看代码,代码调用到了 RootWindowContainer类

接着看:


调用到了Task类,方法为resumeTopActivityInnerLocked。

resumeTopActivityInnerLocked方法中又调用到TaskFragment类的resumeTopActivity

resumeTopActivity方法中

//nexts是ActivityRecord

if (next.attachedToProcess()) {

。。。。。。

}  else {

mTaskSupervisor.startSpecificActivity(next,true,true); 

//调用到 ActivityTaskSupervisor类了

}

根据源码看出,先判断activity所在的进程和主线程是否已经启动,如果是则调用realStartActivityLocked方法

否则,通知AMS执行startProcessAsync方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容