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

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

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

Activity的生命周期是谁调用的?_第1张图片

Activity的生命周期是谁调用的?_第2张图片


        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的生命周期是谁调用的?_第3张图片


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

   final H mH = new H();
Activity的生命周期是谁调用的?_第4张图片

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

 


你可能感兴趣的:(Android)