文化袁探索专栏——Activity|Application启动流程

文化袁探索专栏——Activity、Window和View三者间关系
文化袁探索专栏——View三大流程#Measure
文化袁探索专栏——View三大流程#Layout
文化袁探索专栏——消息分发机制
文化袁探索专栏——事件分发机制
文化袁探索专栏——Launcher进程启动流程’VS’APP进程启动流程
文化袁探索专栏——Activity|Application启动流程
文化袁探索专栏——自定义View实现细节
文化袁探索专栏——线程池执行原理|线程复用|线程回收
文化袁探索专栏——React Native启动流程

android API30 分析

Activity的启动流程分析

Activity启动流程这里从三个维度分析:
1,Launcher进程中的MainActivity的启动;
2,普通APP进程中的MainActivity的启动;
3,通过Context.startActivity()方式的启动;

三个不同维度的启动流程,在开始时候的启动流程完全不同,而进入到ActivityStackSupervisor的方法realStartActivityLocked时,Acitvity启动流程则会进入统一的一致性入口。

Launcher进程MainActivity的启动

// 在AndroidManifest.xml,如何自定义桌面应用?
<intent-filter>
	 <action android:name=“android.intent.action.MAIN”>
	 <category android:name=“android.intent.category.LAUNCHER” /> 
	 <category android:name=“android.intent.category.HOME”/>      
	 <category android:name=“android.intent.category.DEFAULT”/>   
</intent-filter>


在这里插入图片描述

在这里插入图片描述

/**ProcessList.jva*/
boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
            int zygotePolicyFlags, boolean disableHiddenApiChecks, boolean disableTestApiChecks,
            boolean mountExtStorageFull, String abiOverride) {
	...  ....
	 // Start the process.  It will either succeed and return a result containing
     // the PID of the new process, or else throw a RuntimeException.
     final String entryPoint = "android.app.ActivityThread";
	 // 启动进程并设置进程入口类,entryPoint = "android.app.ActivityThread";
     return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
                    runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
                    instructionSet, invokeWith, startTime);
	.........
}

当Launcher进程创建成功后,zygote进程会通过JNI方式调用ZygoteInit.java,进而调用ActivityThread#Main方法。开启Looper循环,使主线程具有消息分发能力。初始化ActivityThread。ActivityThread调用attach方法,

thread.attach(false, startSeq);

// ActivityThread.attach
final IActivityManager mgr = ActivityManager.getService();
try {
    mgr.attachApplication(mAppThread, startSeq);//进入ams系统服务层
} catch (RemoteException ex) {
   throw ex.rethrowFromSystemServer();
}

在ActivityThread的attach方法中,会执行ActivityMananerService的方法attachApplication方法,向AMS注册自己,同时传递IApplicationThreadBinder对象以便于AMS能够对四大组件进行调度。然后在AMS中由 ATMS#LocalService调用了attcachAplication方法,查看栈顶部是否有Activity在等待启动。然后有则进入到ATMS中,并经RootWindowContainer.attachApplication()、startActivityForAttachedApplicationIfNeeded方法调用,将Activity的启动交给了ActivityStackSupervisor。就此进入所有Activity启动的统一入口方法realStartActivityLocked。

private boolean startActivityForAttachedApplicationIfNeeded(ActivityRecord r,
            WindowProcessController app, ActivityRecord top) {
try {//ActivityStackSupervisor执行启动Activity的逻辑
    if (mStackSupervisor.realStartActivityLocked(r, app, top == r /*andResume*/,
                    true /*checkConfig*/)) {
                mTmpBoolean = true;
    }
} catch (RemoteException e) {...}
}

在方法realStartActivityLocked中,又会将Activity的启动交给ClientLifeCycleTransaction安排启动事务。

// ActivityStackSupervior.java
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);

再交由ClientTransaction调度事务,并将事务发送给ApplicatioinThread,由此将触发实际的事务调度。

// ClientTransaction.java
public void schedule() throws RemoteException {
    mClient.scheduleTransaction(this);
}

// ActivityThead$ApplicationThread.java
@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
    ActivityThread.this.scheduleTransaction(transaction);
}

然后就从在ApplicationThread切换到了ActivityThread ,由于ActivityThread 实现自ClientTransactionHandler。

public final class ActivityThread extends ClientTransactionHandler

在ClientTransactionHandler中通过发送Message消息,并能被ActivityThread$H 捕获。进而触发下面的ActivityThread.performLaunchActivity()方法。ActivitityThread#performLaunchActivity主要负责执行来自AMS对Activity创建调度的执行。

void scheduleTransaction(ClientTransaction transaction) {
   transaction.preExecute(this);
   sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

将Activity的真实创建交给Instrumentation,通过newActivity反射创建。

activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);

Activity实例创建成功后,调用attach开启生命周期。

activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback,
                        r.assistToken);

activity.mCalled = false;
if (r.isPersistable()) {
    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
    mInstrumentation.callActivityOnCreate(activity, r.state);
}

普通APP进程MainActivity的启动
通过Context.startActivity()方式的启动

在这里插入图片描述

Application启动流程参照Activity可以从两个维度分析:
1,Launcher进程中的Application的启动;
2,APP进程中的Application的启动;

这里先叙述Activity的启动流程,在三种维度下是如何进行启动的。…待续…

Application的启动流程分析

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值