番外: 如何分析問題:
1. 一個問題的出現(xiàn),必然有它的原因,場景,觸發(fā)條件
2. 冷靜的分析解決問題:
? ? ? ? ? 1. what 這個問題是什么
? ? ? ? ? 2. when 在什么場景下發(fā)生的
? ? ? ? ? 3. how 上下文是什么,如何被觸發(fā)
? ? ? ? ? 4. why 為什么被觸發(fā)
一:Activity?
1. 什么是Activity?
1. Android 四大組件之一
2. 是 context 子類,同時實現(xiàn)了 window.callback、keyevent.callback 可以處理窗體與用戶交互的事件
3. 常見的 Activity 有 FragmentActivity、ListActivity、TabActivity
4. 如果界面有共同的特點或工鞥呢,我們還會自己定義一個 BaseActivity
2. Activity 的生命周期
1. onCerate 初始化
2. onStart 可見 不可交互
3. onResume 獲得焦點,可交互,此時的 Activity 進入運行狀態(tài)
4. onPause 失去焦點
5. onStop 不可見
6. onRestart 重新變得可見
3. 啟動一個 Activity?
1. 先調(diào)用 onCreate 初始化
2. 再調(diào)用 onStart 可見
3. 最后調(diào)用 onResume 獲得焦點
4. 失去焦點
1. 會調(diào)用 onRause 暫停當前 Activity 的執(zhí)行
5. Activity 不可見?
1. 先調(diào)用 onPause 失去焦點
2. 再調(diào)用 onStop 變得不可見
6. 再次可見
1. 先調(diào)用 onRestart
2. 再調(diào)用 onStart 變得可見
3. 最后調(diào)用 onResume 進入運行狀態(tài)
7. 系統(tǒng)殺死當前 Activity<內(nèi)存不足>,再退回當前 Activity
1. 重新走流程 onCreate -> onStart -> onResume
2. 說明:
? ? ? ? ? 1. 當系統(tǒng)認為一個 Activity 可能會被回收時,系統(tǒng)會調(diào)用它的 onSaveInstanceState 方法
? ? ? ? ? 2. 當一個被回收的系統(tǒng)被重新打開時,系統(tǒng)會調(diào)用它的 onRestoreInstanceState 方法
? ? ? ? ? 3. 當 Activity 系統(tǒng)配置發(fā)生改變后,如果他被重新啟動,那么系統(tǒng)會:
? ? ? ? ? ? ? ? ? ? 1. 通過 onSaveInstanceState 保存數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? 2. 同時通過 onRestoreInstance 來恢復(fù)數(shù)據(jù)
8. 橫豎屏切換時 Activity 的生命周期
1. 跟清單文件中的配置有關(guān):
? ? ? ? ? 1. 不設(shè)置 Activity 的 android:configChanges 時,切屏?xí)匦抡{(diào)用各個生命周期,默認首先賢惠當前的 Activity 然后重新加載
? ? ? ? ? 2. 設(shè)置時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行 onConfigurationChanged 方法
9. 將一個 Activity 設(shè)置成窗口樣式?
1. 配置:android:theme=“@androids:style/Theme.Dialog”
10. 如何退出一個 Activity
1. 返回鍵退出
2. 代碼直接調(diào)用 finish() 方法
11. 如何安全退出已調(diào)用多個 Activity 的 App
1. 記錄打開的 Activity,退出時關(guān)閉每一個即可
2. 發(fā)送特定的廣播關(guān)閉 Activity
3. 遞歸退出:在打開新的 Activity 時,調(diào)用 startActivityResult 方法,然后自己加 tag,在 onActivityResult 中處理
12. Activity 的 4 種 LaunchMode<啟動模式>
1. standard 標準模式 <默認>:
? ? ? ? ? 1. 不管有沒有已存在的實例,都會生成一個新的實例
? ? ? ? ? 2. 可以有多個相同的實例,允許多個相同的 Activity 疊加
2. singleTop 棧頂復(fù)用:
? ? ? ? ? 1. 對應(yīng)的 Activity 實例位于棧頂,則重復(fù)利用,否則生成新的實例
? ? ? ? ? 2. 調(diào)用 onNewIntent 方法 <沒有創(chuàng)建新的 Activity>
? ? ? ? ? 3. 避免棧頂?shù)?Activity 被重復(fù)創(chuàng)建,影響用戶體驗
? ? ? ? ? 4. 應(yīng)用場景:瀏覽器書簽
3. singleTask 棧內(nèi)復(fù)用
? ? ? ? ? 1. 該 Activity 實例之上的其他 Activity 實例全部出棧
? ? ? ? ? 2. 使此 Activity 實例成為棧頂對象,顯示到屏幕前
?4. singleInstance 單例
? ? ? ? ? 1. 啟用一個新的棧結(jié)構(gòu),將該 Activity 的實例放置中,并保證不會有其他的 Activity 實例進入
13. Activity Window View 三者之間的關(guān)系

1. Activity 控制單元,Window 承載模型,View 顯示視圖
2. Activity 在創(chuàng)建時,還會創(chuàng)建一個 window、DecorView
2. Activity 通過 ViewRoot 將視圖 View 添加在 Window 上
3. Activity 控制、依賴 Window,Window 通過 ViewRoot 和 DecorView 和 View 建立聯(lián)系
14. 如何判斷當前的應(yīng)用是在前臺還是后臺?
1. 在 Activity 的生命周期中維護一個常量值
2. 在 onStart 時 appCount +1
3. 在 onStop 時 appCount -1
4. 判斷該值是否為 0,就可以判斷該 App 是在前臺還是后臺
5. eg:
? ? ? ? ? 1. 啟動 Activity A,onStart appCount = 1,
? ? ? ? ? 2. 在 A 中啟動 Activity B,APPCount = 2,
? ? ? ? ? 3. A 經(jīng)過 onStop,APPCount = 1
? ? ? ? ? 4. 直接退出,按 Home,沒有 onStart,只經(jīng)歷 onStop,此時處于后臺,appCount = 0