Android的finish後方法中的程式碼繼續執行
阿新 • • 發佈:2019-01-27
1.finished之後的生命週期很明白.但finish之後的程式碼是否執行呢?
2.測試:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("hello wofrld 1"); finish(); System.out.println("hello wofrld 2"); }
3.結果:
hello wofrld 1
hello wofrld 2
//2017年4月21日更新
4.分析:
finish執行的是一個非同步的方法,看finish原始碼
ActivityManagerNative.getDefault().finishActivity(mToken, resultCode, resultData, finishTask)
ActivityManagerNative.getDefault()
返回AMS(ActivityManagerService)的Binder發起IPC(程序間通訊)非同步呼叫AMS的finishActivity。類比執行緒的話就是thread.start(),所以UI執行緒繼續往下走。
finish之後的onPause是怎麼被呼叫的呢?
finishActivity的第一個實參mToken 是個Binder(IBinder介面) ,其實現類是ApplicationThread。
ApplicationThread是ActivityThread的內部類,所以持有ActivityThread物件的引用,可以愉快的往UI執行緒的Looper裡put message。
ActivityThread:應用程序啟動時FrameWork層建立的,持有管理著MessageQueue的Looper,MessageQueue無限迴圈,處理各種Service發來的資訊(如InputManagerService發來的touch事件、AMS發來Activity的各種生命週期回撥和應用自定義的Handler的資訊。
所以把ApplicationThread這個Binder傳給AMS,AMS就可以在處理完Activity的堆疊變更後(比如讓stack中那個Activity接下來展示),通過ApplicationThread這個Binder 發起IPC嚮應用程序的MessageQueue裡put事件,事件引發呼叫Activity物件的onPause方法(你可以在onPause拋個異常,看堆疊資訊)。