之前在github上更新了些關於面試類的文章,含有從基礎到進階。含有BATJ.字節跳動面試專題,算法專題,高端技術專題,混合開發專題,java面試專題,Android,Java小知識,到性能優化.線程.View.OpenCV.NDK等應有盡有。還有輔之相關的視頻+學習筆記
https://github.com/xiangjiana/androids
好久沒更新了,公司電腦太卡了o(╥﹏╥)o。(把所以的知識+每日一題整理成了份983頁的PDF)
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
可以點擊關於我聯繫我獲取完整PDF
(VX:mm14525201314)
一丶Fragment
1 、談一談 Fragment 的生命週期?
參考回答:
Fragment 從創建到銷燬整個生命週期中涉及到的方法依次
爲:onAttach()
→onCreate()
→onCreateView()
→onActivityCreated()
→onStart()
→onR<br/>esume()
→onPause()
→onStop()
→onDestroyView()
→onDestroy()
→onDetach()
,其中和 Activity 有不少名稱相同
作用相似的方法,而不同的方法有:
onAttach()
: 當 Fragment 和 Activity 建立關聯時
調用;onCreateView()
: 當 fragment 創建視圖調用,在
onCreate 之後;onActivityCreated()
: 當與 Fragment 相關聯的
Activity 完成onCreate()
之後調用;onDestroyView()
: 在 Fragment 中的佈局被移除時
調用;onDetach()
: 當 Fragment 和 Activity 解除關聯時
調用;
2 、談談 Activity 和 和 Fragment 的區別?
參考回答:
相似點: 都可包含佈局、可有自己的生命週期
不同點:
- Fragment 相比較於 Activity 多出 4 個回調週期,
在控制操作上更靈活; - Fragment 可以在 XML 文件中直接進行寫入,也可以
在 Activity 中動態添加; - Fragment 可以使用 show()/hide()或者 replace()
隨時對 Fragment 進行切換,並且切換的時候不會出
現明顯的效果,用戶體驗會好;Activity 雖然也可
以進行切換,但是 Activity 之間切換會有明顯的翻
頁或者其他的效果,在小部分內容的切換上給用戶
的感覺不是很好;
3 、Fragment 中 add 與 與 replace 的區別(Fragment 重疊)
參考回答:
- add 不會重新初始化 fragment,replace 每次都會。所以
如果在 fragment 生命週期內獲取獲取數據,使用 replace
會重複獲取; - 添加相同的 fragment 時,replace 不會有任何變化,add
會報IllegalStateException
異常; - replace 先 remove 掉相同 id 的所有 fragment,然後在
add 當前的這個 fragment,而 add 是覆蓋前一個
fragment。所以如果使用 add 一般會伴隨 hide()和
show(),避免佈局重疊; - 使用 add,如果應用放在後臺,或以其他方式被系統銷
毀,再打開時,hide()中引用的 fragment 會銷燬,所以依
然會出現佈局重疊 bug,可以使用 replace 或使用 add
時,添加一個 tag 參數;
4 、 getFragmentManager
、 getSupportFragmentManager
、
getChildFragmentManager
之間的區別?
參考回答:
getFragmentManager()
所得到的是所在 fragment 的 父容器
的管理器,getChildFragmentManager()
所得到的是在
fragment 裏面 子容器的管理器, 如果是 fragment 嵌套
fragment,那麼就需要利用getChildFragmentManager();
- 因爲 Fragment 是 3.0 Android 系統 API 版本纔出現的組
件,所以 3.0 以上系統可以直接調用getFragmentManager()
來獲取FragmentManager()
對象,
而 3.0 以下則需要調用getSupportFragmentManager()
來
間接獲取;
5 、FragmentPagerAdapter
與 與 FragmentStatePagerAdapter
的區別與使用場景
參考回答:
相同點 : 二者都繼承 PagerAdapter
不同點 : FragmentPagerAdapter
的每個 Fragment 會持久的保存在 FragmentManager
中,只要用戶可以返回到頁面
中,它都不會被銷燬。因此適用於那些數據 相對靜態的
頁,Fragment 數量也比較少的那種;FragmentStatePagerAdapter
只保留當前頁面,當頁面不
可見時,該 Fragment 就會被消除,釋放其資源。因此適用
於那些 數據動態性較大、 佔用內存較多,多 Fragment 的情
況;
二、Activity
1丶說下 Activity 生命週期?
參考解答: 在正常情況下,Activity 的常用生命週期就只有如下 7 個
onCreate()
: 表示 Activity 正在被創建,常用來 初始化工作,比
如調用setContentView
加載界面佈局資源,初始化 Activity 所
需數據等;onRestart()
:表示 Activity 正在重新啓動,一般情況下,當前Acitivty
從不可見重新變爲可見時,OnRestart
就會被調用;onStart()
: 表示 Activity 正在被啓動,此時 Activity 可見但不
在前臺,還處於後臺,無法與用戶交互;onResume()
: 表示 Activity 獲得焦點,此時 Activity 可見且在
前臺並開始活動,這是與onStart
的區別所在;onPause()
: 表示 Activity 正在停止,此時可做一些 存儲數據、
停止動畫等工作,但是不能太耗時,因爲這會影響到新 Activity
的顯示,onPause
必須先執行完,新 Activity 的onResume
纔會
執行;onStop()
: 表示 Activity 即將停止,可以做一些稍微重量級的回
收工作,比如註銷廣播接收器、關閉網絡連接等,同樣不能太耗
時;onDestroy()
: 表示 Activity 即將被銷燬,這是 Activity 生命周
期中的最後一個回調,常做 回收工作、資源釋放;
延伸: 從 整個生命週期來看,onCreate
和 onDestroy
是配對的,分別標識着 Activity 的創建和銷燬,並且只可能有 一次調用; 從 Activity 是否可見來說,onStart
和 onStop
是配對的,這兩個方法可能被 調用多次; 從 Activity 是否在前臺來說,onResume
和 onPause
是配對的,這兩個方法可能被 調用多次; 除了這種區別,在實際使用中沒有其他明顯區別;
2 、 Activity A 啓動另一個 Activity B 會調用哪些方法?如果 B 是透明主題的又或則是個 DialogActivity
呢 ?
參考解答: Activity A 啓動另一個 Activity B,回調如下
- Activity A 的
onPause()
→ Activity B 的onCreate()
→onStart()
→onResume()
→ Activity A 的onStop();
- 如果 B 是透明主題又或則是個
DialogActivity
,則不會回調 A 的onStop;
3 、說下 onSaveInstanceState()
方法的作用 ? ? 何時會被調用?
參考解答:
發生條件:異常情況下( 系統配置發生改變時導致 Activity被殺死並重新創建、資源內存不足導致低優先級的 Activity 被殺死)
- 系統會調用
onSaveInstanceState
來保存當前 Activity 的狀態,
此方法調用在onStop
之前,與onPause
沒有既定的時序關係; - 當 Activity 被重建後,系統會調用
onRestoreInstanceState
,
並且把onSave
(簡稱)方法所保存的 Bundle 對象 同時傳參給onRestore
(簡稱)和onCreate()
,因此可以通過這兩個方法判斷Activity 是否被重建,調用在onStart
之後;
4 、說下 Activity 的四種啓動模式、應用場景 ?
參考回答:
- standard 標準模式: 每次啓動一個 Activity 都會重新創建一個
新的實例,不管這個實例是否已經存在,此模式的 Activity 默認
會進入啓動它的 Activity 所屬的任務棧中; singleTop
棧頂複用模式: 如果新 Activity 已經位於任務棧的棧頂,那麼此 Activity 不會被重新創建,同時會回調onNewIntent
方法,如果新 Activity 實例已經存在但不在棧頂,那麼Activity 依然會被重新創建;- singleTask 棧內複用模式: 只要 Activity 在一個任務棧中存在,那麼多次啓動此 Activity 都不會重新創建實例,並回調
onNewIntent
方法,此模式啓動 Activity A,系統首先會尋找是
否存在 A 想要的任務棧,如果不存在,就會重新創建一個任務
棧,然後把創建好 A 的實例放到棧中; singleInstance
單實例模式: 這是一種加強的singleTask
模
式,具有此種模式的 Activity 只能單獨地位於一個任務棧中,且
此任務棧中只有唯一一個實例;
5 、瞭解哪些 Activity 常用的標記位 Flags ?
參考回答:
- FLAG_ACTIVITY_NEW_TASK : 對應
singleTask
啓動模式,其效果和在 XML 中指定該啓動模式相同; - FLAG_ACTIVITY_SINGLE_TOP : 對應
singleTop
啓動模式,其效果和在 XML 中指定該啓動模式相同; - FLAG_ACTIVITY_CLEAR_TOP : 具有此標記位的 Activity,當它啓動時,在同一個任務棧中所有位於它上面的 Activity 都要出棧。這個標記位一般會和
singleTask
模式一起出現,在這種情況下,被啓動 Activity 的實例如果已經存在,那麼系統就會回調onNewIntent
。如果被啓動的 Activity 採用 standard 模式啓動,那麼它以及連同它之上的 Activity 都要出棧,系統會創建新的Activity 實例並放入棧中; - FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具有這個標記的Activity 不會出現在歷史 Activity 列表中;
6 、說下 Activity 跟 跟 window , view 之間的關係?
參考回答:
Activity 創建時通過 attach()
初始化了一個 Window 也就是PhoneWindow
,一個 PhoneWindow
持有一個 DecorView
的實例,DecorView
本身是一個 FrameLayout
,繼承於 View,Activty
通過setContentView
將 xml
佈局控件不斷 addView()
添加到 View 中,最終顯示到 Window 於我們交互;
7 、橫豎屏切換的 Activity 生命週期變化?
參考回答:
- 不設置 Activity 的
android:configChanges
時,切屏會銷燬當前Activity,然後重新加載調用各個生命週期,切橫屏時會執行一
次,切豎屏時會執行兩次;onPause()
→onStop()
→onDestory()
→onCreate()
→onStart()
→onResume()
- 設置 Activity 的
android:configChanges=" orientation"
,經過
機型測試- 在 Android5.1 即 即 API 3 23 級別下,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次
- 在 Android9 即 即 API 8 28 級別下,切屏不會重新調用各個生命週期,只會執行
onConfigurationChanged
方法 - 官方糾正後,原話如下
如果您的應用面向 Android 2 3.2 即 即 API 級別 3 13 或更
高級別(按照minSdkVersion
和targetSdkVersion
)
請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
可以點擊關於我聯繫我獲取完整PDF
(VX:mm14525201314)