深入理解Activity——Activity是如何启动的
2015-12-20 13:50
447 查看
Read TheFucking Source Code!
Framework层对Activity进行统一的控制,例如Activity栈的管理、生命周期方法的回调、进程间通信等ActivityThread
ActivityThread是线程吗?
本质上它不是一个线程,通过查看源码发现他只是一个普通java类,没有继承任何的Thread类,ActivityThread控制Activity生命周期方法的回调,具体的操作都是由远程的ActivityManagerService跨进程间通信调用的ActivityThread是如何被启动的?
我们一直都说Activity的入口是onCreate方法。其实android一个应用的入口,应该是ActivityThread。和普通的java类一样,入口是一个main方法。下面仔细分析一下这个main方法。
public static final void main(String[]args) {
SamplingProfilerIntegration.start();
……
//1.创建消息轮询对象
Looper.prepareMainLooper();
if (sMainThreadHandler== null) {
sMainThreadHandler = newHandler();
}
//2.创建自身的对象
ActivityThread thread =new ActivityThread();
//做一些相关处理
thread.attach(false);
……
//3.轮询消息队列
Looper.loop();
……
thread.detach();
……
Slog.i(TAG, "Mainthread of " + name + " is now exiting");
}
1. Looper.prepareMainLooper();
ActivityThread其实就是我们经常说的UI thread,也就是主线程。我们都知道主线程可以使用Handler进行异步通信,因为主线程中已经创建了Looper,而这个Looper就是在这里 创建的。如果其他线程需要使用Handler通信,就要自己去创建Looper。
2. 创建ActivityThread 对象。
ActivityThread thread = new ActivityThread();
attach() :ActivityManagerNative.getDefault():它是ActivityManagerService的远程代理对象,(简称)AMS是运行在单独的进程中,在另外的进程中通过ActivityManagerNative.getDefault()就可以与AMS进行通信
如果再具体看mgr.attachApplication(mAppThread);源码,会发现其实就是调用远程binder去传输一个具体的数据而已
ActivityThread 有几个比较重要的成员变量,会在创建ActivityThread对象时初始化。
1) finalApplicationThread mAppThread = new ApplicationThread();
它会通过binder与 AMS通信,并将AMS的调用,通过下面的H类(也就是Hnalder)将消息发送到消息队列,然后进行相应的操作,如activity的start, stop。
2) finalH mH = new H();
private final class H extends Handler
mH负责处理ApplicationThread发送到消息队列的消息,例如:
publicvoid handleMessage(Message msg) {
if(DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what);
switch(msg.what) {
case LAUNCH_ACTIVITY: {
ActivityClientRecordr = (ActivityClientRecord)msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo);
handleLaunchActivity(r, null);
} break;
………
3. handleLaunchActivity(r, null);
从名字中就可以看出,这里就将进行启动activity的工作了。
方法中主要调用了这一句:
Activity a = performLaunchActivity(r, customIntent);
4. performLaunchActivity()
进行了一些初始化和赋值操作后,创建activity。
通过此方法将上下文与activity进行关联:createBaseContextForActivity
创建一个contextImpl类,每一个context中又有一个关联的activity
而后调用attach方法与WindowManager进行关联
然后通过Instrumentation回调:
Instrumentation.callActivityOnCreate(activity, r.state);
这一句就会调用到acitivity的onCreate方法,就进入了大多数应用开发的入口了。
ApplicationThread
ApplicationThread继承自ApplicationThreadNative,而ApplicationThreadNative又继承自Binder并实现了IApplicationThread接口。 IApplicationThread继承自IInterface。这是一个很明显的binder结构,
(Android虽然构建在Linux上面,但是在IPC机制方面,没有利用Linux提供IPC机制,而是自己实现了一套轻量级的IPC机制,就是 binder 。)
用于和远程端(AMS)进行通信。 IApplicationThread接口定义了对一个程序(linux的进程)操作的接口
具体通信的处理逻辑:onTransact()
ActivityClientRecord是什么
定义在ActivityThread中,客户端Activity的描述类,与Activity息息相关,包含Activity的配置信息ActivityRecord
代表了一个Client端的Activity,记录了Activity的各种属性和管理状态,ActivityManagerService中做存储Activity记录的类
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories