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方法;