在平时开发中,Activity我们每个人应用的都滚瓜烂熟,回忆起来没有太难的地方,但是我们学习知识不应该只知其一不知其二,这样才能在学习的道理上越走越远,今天我要给大家分享的内容会让大家明白一些Android内部的实现机制以及Activity在整个FrameWork层是如何交互处理的和FrameWork层是如何管理Activity的生命周期的。学习之前建议大家把FrameWork的源码下载下来,下载地址:https://github.com/android/platform_frameworks_base
一、FrameWork相关类介绍
1、ActivityThread
ActivityThread本身不是一个线程,就是就jave里的一个普通的类,我们在启动一个APP应用当中,主进程会调用ActivityThread。调用完ActivityThread类之后,会做以下工作,也就是mian()方法里的内容:Looper.preparMianLooper()、ActivityThread thread=new ActivityThread ()、thread.attach(false)、Looper.loop()。当这些方法完成之后ActivityThread就会通知AMS,拿到远程代理对象IActivityManager mgr=ActivityManagerNative.getDefault();mgr.attachApplication()
2、ApplicationThread
这个类继承了ApplicationThreadNative,而ApplicationThreadNative是Binder的子类,那么说明ApplicationThread需要和远程端进行通信,主要是和ActivityMangerService进行通信。
3、ActivityClientRecord
ActivityClientrecord类里定义了许多和Activity相关的成员变量
二、Context类介绍
Context是一个接口,它有具体如下的实现类:Context——>ContextWrapper——>ContextThemeWrapper——>Activity
Context——>ComtextImpl
ContextWrapper——>Service
ContextWrapper——>Application
Context里其实定义了一些和Activity息息相关的资源,如sendBroadCast()、registerReceiver()等等,下面我来说一说Context的几个子类。
1、ContextWrapper
假如你看过这个类的源码,会发现,这里所有重写的方法都用到了一个全局变量mBase,我列出来了一个ContextWrapper类里的方法如下:
@Override public Resources getResources() { return mBase.getResources(); }
那么这个全局变mBase代表什么呢,我们来看一下这个类的构造方法,发现mBase就是Context 的对象并且在构造方法里给mBase赋值了,代码如下:
Context mBase; public ContextWrapper(Context base) { mBase = base; }
上面讲了一些铺垫内容,下面我要说一说Activity的生命周期
其实就是ActivityThread这个类控制着Activity生命周期的一些回调,具体的是由ActivityMangerService跨进程通信调用的,在ActivityThread的源码里有一个H类,这个H类实现了Handler,这个H类的作用就是处理ActivityMangerService跨进程通信发送过来的消息。在Activity生命周期回调的过程中,有几个重要的类和概念。
1、instrumentation类
主要作用是回调Activity生命周期的各个方法和打开Activity,也可以创建Application对象