1. 程式人生 > >Activity的生命週期是誰呼叫的?

Activity的生命週期是誰呼叫的?

        我們知道Activity的生命週期包括onCreate、onStart、onResume、onRestart、onStop、onDestory、onSaveInstanceState、onRestoreInstanceState等等, 那麼是誰呼叫了它呢?

答:是ActivityThread排程的, 具體邏輯封裝在Instrumentation類裡。 好好看看這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) {

        }
        .....
     }
}

執行看看效果:


ActivityThread有個成員變數mH, 它是幹嘛用的?

   final H mH = new H();

   類H繼承於Handler, mH是為了實現非同步操作,所有操作都放到主執行緒MessageQueue佇列裡實現。  比如A程序開啟B程序的Activity, 通過Binder機制由ActivityManagerProxy執行啟動activity的邏輯, 但這個操作是非同步的。 A程序相當於做個觸發事件, 不會阻塞等待B程序的activity啟動。