Activity的生命週期是誰呼叫的?
阿新 • • 發佈:2018-12-25
我們知道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啟動。