一、activity跨进程启动
- 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求
- system_server进程接收到请求后,向zygote进程发送创建进程的请求;
Zygote进程fork出新的子进程,即App进程 - App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
- system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进 程发送scheduleLaunchActivity请求
- App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息
- 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法
二、activity进程内启动
1.相关类
- ActivityThread:main()函数,相当于一个Handler,主线程,UI线程
- ApplicationThread:与AMS沟通桥梁
- mInstrumentation:通过这个api启动app,用来跟踪Activity和Application生命周期的类
- AMS:数据管理者
2.启动流程
请求进程A:startActivity—(hook插入点1) (AMP,ActivityManager代理对象)——> system_server进程:AMS(ActivityManagerService)解析Activity信息、处理启动参数、scheduleLaunchActivity/mH中EXECUTE_TRANSACTION消息处理(Android P)–>回到请求进程A:ApplicationThread --> ActivityThread -(hook插入点2)-> Activity生命周期
简单点来说就是通过AMS代理类,封装创建Activity的信息,然后回调给ActivityThread,通过mInstrumentation创建Activity,调用onCreate方法启动Activity
三、显式启动和隐式启动
1.显式启动
1、构造方法传入Component,最常用的方式
2、setComponent(componentName)方法
3、setClass/setClassName方法文章来源:https://www.toymoban.com/news/detail-493958.html
2.隐式启动
隐式Intent是通过在AndroidManifest文件中设置action、data、category,让系统来筛选出合适的Activity文章来源地址https://www.toymoban.com/news/detail-493958.html
<activity
android:name="com.juexiao.fakao.ui.activity.WelcomeActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="com.jrmf360.action.ENTER"/>
<category android:name="android.intent.category.DEFAULT"/>
<data
android:host="jrmf360.com"
android:port="8888"
android:scheme="jrmf"/>
</intent-filter>
</activity>
action匹配规则
- Intent-filter action可以设置多条
- intent中的action只要与intent-filter其中的一条匹配成功即可,且intent中action最多只有一条
- Intent-filter内必须至少包含一个action
category匹配规则
- Intent-filter内必须至少包含一个category,android:name为
android.intent.category.DEFAULT
- intent-filter中,category可以有多条
- intent中,category也可以有多条
- intent中所有的category都可以在intent-filter中找到一样的(包括大小写)才算匹配成功
data匹配规则
- intent-filter中可以设置多个data
- intent中只能设置一个data
- intent-filter中指定了data,intent中就要指定其中的一个data
到了这里,关于Activity启动流程分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!