文化袁探索专栏——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启动流程相关推荐

  1. 文化袁探索专栏——React Native启动流程

    文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...

  2. 文化袁探索专栏——Activity、Window和View三者间关系

    文化袁探索专栏--Activity.Window和View三者间关系 <文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--H ...

  3. 文化袁探索专栏——消息分发机制

    文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...

  4. 文化袁探索专栏——事件分发机制

    文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...

  5. 文化袁探索专栏——线程池执行原理|线程复用|线程回收

    文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...

  6. 文化袁探索专栏——自定义View实现细节

    文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...

  7. 【拒绝一问就懵】之Activity的启动流程

    背景介绍 从事开发到了一定阶段,想要提高就必须搞明白系统的一些工作原理.为什么?因为只有明白了这些,你才能针对平台的特性写出优质的代码.当遇到棘手的问题时,你才能更快速的结合系统原理去寻找最优解决方案 ...

  8. Activity的启动流程

    Activity的启动流程 努力工作 自己平时工作接触的frameworks代码比较多,但真正理解的很有限,一直在努力分析..我主要还是用补丁的形式来看 core/java/android/app/A ...

  9. Application启动流程

    先对整体有了一个基本的认识之后,再去看细节 谈到Android Application的启动流程,很多文章都是各种源码类和方法的一堆调用关系,这样的文章就算看一百遍,也只是云里雾里.源码得看,但是最好 ...

最新文章

  1. CodeForces - 1343E Weights Distributing(最短路)
  2. springboot scheduled多线程
  3. 绘制二次三次曲线多次曲线
  4. 递归和非递归实现规律函数
  5. itex将html转成pdf加水印,itext操作PDF文件添加水印
  6. Java中快速处理集合_简洁又快速地处理集合——Java8 Stream(上)
  7. 产品狗,工作三年,转行AI应该怎样规划?
  8. 详解Python变量作用域
  9. QA: Android 开发kotlin换行格式难看问题
  10. 7纳米,80核:Ampere第二代云数据中心Arm芯片即将推出
  11. linux的常用的安装命令
  12. 【PS】制作透明质感按钮
  13. 金网seo工具资源全套软件
  14. Abbirb120型工业机器人_ABB机器人IRB120资料的详细介绍
  15. 虚拟机启动network服务启动失败:ob for network.service failed because the control process exited with error code
  16. Visual C++6.0画三维立体图形
  17. 带你了解IT互联网行业程序员岗位有些什么类型?
  18. CUDA:实现Sobel边缘检测滤波器的实例
  19. 使用搜索引擎搜索指定网站的内容
  20. 程伟健:新城易居携手中旅联盟深度发力打造城市中心文旅目的地

热门文章

  1. CAN总线基础知识点
  2. Mifare UltraLight 卡存储结构
  3. java递归红与黑答案,递归--红与黑
  4. Android 页面Scheme配置
  5. PHP测试是否已连接MYSQL数据库源码
  6. 二维码扫描的样式总结
  7. python实现模拟浏览器操作
  8. 【毕业设计_课程设计】基于移动设备的眼球追踪技术及其应用(源码+论文)
  9. 力软工作流:协同OA精准化采购平台自主搭建
  10. 诚信可靠的深圳python_ai人工智能哪家正规诚信经营