我们知道Activity的生命周期包括onCreate、onStart、onResume、onRestart、onStop、onDestory、onSaveInstanceState、onRestoreInstanceState等等, 那么是谁调用了它呢?

答:是ActivityThread调度的, 具体逻辑封装在Instrumentation类里。 好好看看这2个类就明白了。

Activity的生命周期是谁调用的?-LMLPHP

Activity的生命周期是谁调用的?-LMLPHP

Instrumentation类封装了Activity各个生命周期的方法,  所以想办法替换mInstrumentation参数就可以了。 因为sCurrentActivityThread是单例的,所以hook它就OK了。

public class TheApplication extends Application {
..... private class InstrumentationProxy extends Instrumentation {
private Instrumentation oldInstance; public InstrumentationProxy(Instrumentation instrumentation) {
oldInstance = instrumentation; //取消hook时使用
} @Override
public void callActivityOnResume(Activity activity) {
Log.d("brycegao", activity.getClass().toString() + " 执行了onPause方法");
super.callActivityOnResume(activity);
} @Override
public void callActivityOnStop(Activity activity) {
Log.d("brycegao", activity.getClass().toString() + " 执行了onStop方法");
super.callActivityOnStop(activity);
}
} @Override
public void onCreate() {
super.onCreate(); try {
Class<?> clz = Class.forName("android.app.ActivityThread");
Method method = clz.getDeclaredMethod("currentActivityThread");
method.setAccessible(true);
Object currentThread = method.invoke(null); Field mInstrumentationField = clz.getDeclaredField("mInstrumentation");
mInstrumentationField.setAccessible(true);
Instrumentation mInstrumentation = (Instrumentation) mInstrumentationField.get(currentThread); Instrumentation proxy = new InstrumentationProxy(mInstrumentation);
mInstrumentationField.set(currentThread, proxy);
} catch (Exception ex) { }
.....
}
}

运行看看效果:

Activity的生命周期是谁调用的?-LMLPHP

ActivityThread有个成员变量mH, 它是干嘛用的?

   final H mH = new H();

Activity的生命周期是谁调用的?-LMLPHP

类H继承于Handler, mH是为了实现异步操作,所有操作都放到主线程MessageQueue队列里实现。  比如A进程打开B进程的Activity, 通过Binder机制由ActivityManagerProxy执行启动activity的逻辑, 但这个操作是异步的。 A进程相当于做个触发事件, 不会阻塞等待B进程的activity启动。

05-17 15:03