文化袁探索专栏——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的启动流程分析
文化袁探索专栏——Activity|Application启动流程相关推荐
- 文化袁探索专栏——React Native启动流程
文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...
- 文化袁探索专栏——Activity、Window和View三者间关系
文化袁探索专栏--Activity.Window和View三者间关系 <文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--H ...
- 文化袁探索专栏——消息分发机制
文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...
- 文化袁探索专栏——事件分发机制
文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...
- 文化袁探索专栏——线程池执行原理|线程复用|线程回收
文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...
- 文化袁探索专栏——自定义View实现细节
文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...
- 【拒绝一问就懵】之Activity的启动流程
背景介绍 从事开发到了一定阶段,想要提高就必须搞明白系统的一些工作原理.为什么?因为只有明白了这些,你才能针对平台的特性写出优质的代码.当遇到棘手的问题时,你才能更快速的结合系统原理去寻找最优解决方案 ...
- Activity的启动流程
Activity的启动流程 努力工作 自己平时工作接触的frameworks代码比较多,但真正理解的很有限,一直在努力分析..我主要还是用补丁的形式来看 core/java/android/app/A ...
- Application启动流程
先对整体有了一个基本的认识之后,再去看细节 谈到Android Application的启动流程,很多文章都是各种源码类和方法的一堆调用关系,这样的文章就算看一百遍,也只是云里雾里.源码得看,但是最好 ...
最新文章
- CodeForces - 1343E Weights Distributing(最短路)
- springboot scheduled多线程
- 绘制二次三次曲线多次曲线
- 递归和非递归实现规律函数
- itex将html转成pdf加水印,itext操作PDF文件添加水印
- Java中快速处理集合_简洁又快速地处理集合——Java8 Stream(上)
- 产品狗,工作三年,转行AI应该怎样规划?
- 详解Python变量作用域
- QA: Android 开发kotlin换行格式难看问题
- 7纳米,80核:Ampere第二代云数据中心Arm芯片即将推出
- linux的常用的安装命令
- 【PS】制作透明质感按钮
- 金网seo工具资源全套软件
- Abbirb120型工业机器人_ABB机器人IRB120资料的详细介绍
- 虚拟机启动network服务启动失败:ob for network.service failed because the control process exited with error code
- Visual C++6.0画三维立体图形
- 带你了解IT互联网行业程序员岗位有些什么类型?
- CUDA:实现Sobel边缘检测滤波器的实例
- 使用搜索引擎搜索指定网站的内容
- 程伟健:新城易居携手中旅联盟深度发力打造城市中心文旅目的地