1. 程式人生 > >Android的finish後方法中的程式碼繼續執行

Android的finish後方法中的程式碼繼續執行

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拋個異常,看堆疊資訊)。