Activity 啟動過程--學習

4種activity的啟動模式

standard: 標準模式,一調用startActivity()方法就會產生一個新的實例。

singleTop: 如果已經有一個實例位于Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。

如果不位于棧頂,會產生一個新的實例。singleTop適合接收通知啟動的內容顯示頁面。例如,某個新聞客戶端的新聞內容頁面,如果收到10個新聞推送,每次都打開一個新聞內容頁面是很煩人的。

singleTask: 會在一個新的task中產生這個實例,以后每次調用都會使用這個,不會去產生新的實例了。singleTask適合作為程序入口點。例如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,并且會清空主界面上面的其他頁面。

singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity實例所處的task中,只能有這個activity實例,不能有其他的實例。

singleInstance適合需要與程序分離開的頁面。例如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用于中間頁面,如果用于中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出后,在此啟動,首先打開的是B。

http://mp.weixin.qq.com/s?__biz=MjM5NDkxMTgyNw==&mid=2653058030&idx=1&sn=d926905b72512cee1a339a14fe304e53&scene=4#wechat_redirect

如果指定了一個Activity的啟動模式是singleTop的那就應該既要重寫onCreated()方法用于應對第一次創建的情況,也要重寫onNewIntent( )方法來應對重復創建的情況

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

首先從startActivityForResult方法開始分析

ApplicationThread是ActivityThread的一個內部類

我們來看Instrumentation的execStartActivity方法

啟動activity的實現最終是由ActivityManagerNative.getDefault()的startActivity方法來完成;

ActivityManagerService繼承ActivityManagerNative.而ActivityManagerNative繼承于Binder并實現了IActivityManager這個Binder接口因此AMS也是一個Binder;它是IActivityManager的具體實現;

Activity是由ActivityManagerNative.getDefault()來啟動而ActivityManagerNative.getDefault()實際上是AMS

因此Activity的啟動又轉移到了AMS中;那么來看AMS的startActivity方法

接著看Instrumentation的execStartActivity方法其中有一個checkStartActivityResult方法

checkStartActivityResult的作用檢查Activity的啟動結果;

Activity的啟動過程又轉移到了ActivityStackSupervisor的startActivityMayWait方法中

ActivityStackSupervisor轉移到了ActivityStack中

HandlerH對消息的處理

ActivityThread的handlerLaunchAcitivity方法來實現內部有一個performLaunchActivity方法

performLaunchActivity方法主要完成了這幾件事情

1.ActivityClientRecord中獲取啟動Activity組件的信息;

2.通過Instrumentation的newActivity方法來使用類加載器來創建Activity對象

3.通過LoadApk的makeApplication方法來創建Application對象;

4.創建ContextImpl對象并通過Activity的attach方法來完成一些重要數據的初始化;

5。調用Activity的onCreate方法;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容