本文,将从源码角度分析Activity生命周期回调是如何被调用的。
若无特殊说明,源码分析部分采用api为: 21.0.3
.
像java
程序有main
方法作为入口一样,Android
程序也有入口,ActivityThread
的main
方法就是Android
程序的入口。
当Zygote
启动时,会分裂出system_server
并进行不断地ipc轮询,system_server
会创建AMS
等服务。当你在桌面点击一个app
图标时,并且这个app
在内存中是无实例的。AMS
会通知system_server
,由system_server
通知Zygote
去fork
出子进程并执行ActivityThread
的main
方法。main
方法的调用是在子进程的主线程中。
ActivityThread
的main
方法如下所示:
ActivityThread.class
代码片1
public static void main(String[] args) {
// 省略无关代码
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread(); // --->这里是关键,创建了ActivityThread
thread.attach(false); // ---->调用其attach()方法 ---->分析1A
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
先创建ActivityThread
对象,再attach()
。attach()
的分析如下(即代码片1的分析1A):
ActivityThread.class
代码片2
private void attach(boolean system) {
sCurrentActivityThread = this;
// 省略无关代码
//mgr实际是系统服务注意是系统服务 ActivityManager
//在此Android程序这里的本地代理,mgr可以与系统服务ActivityManager通信
final IActivityManager mgr = ActivityManagerNative.getDefault(); --->分析2A
try {
mgr.attachApplication(mAppThread); ---->分析2B
} catch (RemoteException ex) {
// Ignore
}
//省略无关代码
}
代码片2分析2B中,mAppThread
对象究竟是什么类型呢?如下:
private class ApplicationThread extends ApplicationThreadNative {
public abstract class ApplicationThreadNative extends Binder implements IApplicationThread {
public interface IApplicationThread extends IInterface {
通过上面3个继承或实现接口关系,我们可以看出:
(1) mAppThread
的类型是ApplicationThread
(2) 看到Binder
、IInterface
.就知道原来这ApplicationThread
是想对外提供远程服务
(3) 也就是说在某是远端会持有ApplicationThread
的本地代理
(4) 说白了,这里又是Binder
通信而已.
分析2A即 IActivityManager mgr = ActivityManagerNative.getDefault()
点击 ActivityManagerNative.getDefault()
部分,代码如下:
ActivityManagerNative.class
代码片3
static public IActivityManager getDefault() {
return gDefault.get();
}
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity"); --->分析3A
if (false) {
Log.v("ActivityManager", "default service binder = " +