android翻盘效果,行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...
碼個蛋(codeegg) 第 905 次推文
作者:夜貓少年
鏈接:https://juejin.im/post/5c8211fee51d453a136e36b0
Activity篇
1、說下Activity生命周期 ?
參考解答:在正常情況下,Activity的常用生命周期就只有如下7個
onCreate():表示Activity正在被創(chuàng)建,常用來初始化工作,比如調(diào)用setContentView加載界面布局資源,初始化Activity所需數(shù)據(jù)等;
onRestart():表示Activity正在重新啟動,一般情況下,當前Acitivty從不可見重新變?yōu)榭梢姇r,OnRestart就會被調(diào)用;
onStart():表示Activity正在被啟動,此時Activity可見但不在前臺,還處于后臺,無法與用戶交互;
onResume():表示Activity獲得焦點,此時Activity可見且在前臺并開始活動,這是與onStart的區(qū)別所在;
onPause():表示Activity正在停止,此時可做一些存儲數(shù)據(jù)、停止動畫等工作,但是不能太耗時,因為這會影響到新Activity的顯示,onPause必須先執(zhí)行完,新Activity的onResume才會執(zhí)行;
onStop():表示Activity即將停止,可以做一些稍微重量級的回收工作,比如注銷廣播接收器、關閉網(wǎng)絡連接等,同樣不能太耗時;
onDestroy():表示Activity即將被銷毀,這是Activity生命周期中的最后一個回調(diào),常做回收工作、資源釋放;
延伸:從整個生命周期來看,onCreate和onDestroy是配對的,分別標識著Activity的創(chuàng)建和銷毀,并且只可能有一次調(diào)用;從Activity是否可見來說,onStart和onStop是配對的,這兩個方法可能被調(diào)用多次;從Activity是否在前臺來說,onResume和onPause是配對的,這兩個方法可能被調(diào)用多次;除了這種區(qū)別,在實際使用中沒有其他明顯區(qū)別;
2、Activity A 啟動另一個Activity B 會調(diào)用哪些方法?如果B是透明主題的又或則是個DialogActivity呢 ?
參考解答:Activity A 啟動另一個Activity B,回調(diào)如下:
Activity A 的onPause() Activity B的onCreate() onStart() onResume() Activity A的onStop();
如果B是透明主題又或則是個DialogActivity,則不會回調(diào)A的onStop;
3、說下onSaveInstanceState()方法的作用 ? 何時會被調(diào)用?
參考解答:發(fā)生條件:異常情況下(系統(tǒng)配置發(fā)生改變時導致Activity被殺死并重新創(chuàng)建、資源內(nèi)存不足導致低優(yōu)先級的Activity被殺死)
系統(tǒng)會調(diào)用onSaveInstanceState來保存當前Activity的狀態(tài),此方法調(diào)用在onStop之前,與onPause沒有既定的時序關系;
當Activity被重建后,系統(tǒng)會調(diào)用onRestoreInstanceState,并且把onSave(簡稱)方法所保存的Bundle對象同時傳參給onRestore(簡稱)和onCreate(),因此可以通過這兩個方法判斷Activity是否被重建,調(diào)用在onStart之后;
官方文檔(https://developer.android.com/training/basics/activity-lifecycle/recreating.html?hl=zh-cn)
4、說下 Activity的四種啟動模式、應用場景 ?
standard標準模式:每次啟動一個Activity都會重新創(chuàng)建一個新的實例,不管這個實例是否已經(jīng)存在,此模式的Activity默認會進入啟動它的Activity所屬的任務棧中;
singleTop棧頂復用模式:如果新Activity已經(jīng)位于任務棧的棧頂,那么此Activity不會被重新創(chuàng)建,同時會回調(diào)onNewIntent方法,如果新Activity實例已經(jīng)存在但不在棧頂,那么Activity依然會被重新創(chuàng)建;
singleTask棧內(nèi)復用模式:只要Activity在一個任務棧中存在,那么多次啟動此Activity都不會重新創(chuàng)建實例,并回調(diào)onNewIntent方法,此模式啟動Activity A,系統(tǒng)首先會尋找是否存在A想要的任務棧,如果不存在,就會重新創(chuàng)建一個任務棧,然后把創(chuàng)建好A的實例放到棧中;
singleInstance單實例模式:這是一種加強的singleTask模式,具有此種模式的Activity只能單獨地位于一個任務棧中,且此任務棧中只有唯一一個實例;
官方文檔(https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=zh-CN)
5、了解哪些Activity常用的標記位Flags?
FLAG_ACTIVITY_NEW_TASK : 對應singleTask啟動模式,其效果和在XML中指定該啟動模式相同;
FLAG_ACTIVITY_SINGLE_TOP : 對應singleTop啟動模式,其效果和在XML中指定該啟動模式相同;
FLAG_ACTIVITY_CLEAR_TOP : 具有此標記位的Activity,當它啟動時,在同一個任務棧中所有位于它上面的Activity都要出棧。這個標記位一般會和singleTask模式一起出現(xiàn),在這種情況下,被啟動Activity的實例如果已經(jīng)存在,那么系統(tǒng)就會回調(diào)onNewIntent。如果被啟動的Activity采用standard模式啟動,那么它以及連同它之上的Activity都要出棧,系統(tǒng)會創(chuàng)建新的Activity實例并放入棧中;
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具有這個標記的 Activity 不會出現(xiàn)在歷史 Activity 列表中;
官方文檔(https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=zh-CN)
6、說下 Activity跟window,view之間的關系?
Activity在創(chuàng)建時會調(diào)用 attach() 方法初始化一個PhoneWindow(繼承于Window),每一個Activity都包含了唯一一個PhoneWindow。
Activity通過setContentView實際上是調(diào)用的 getWindow().setContentView將View設置到PhoneWindow上,而PhoneWindow內(nèi)部是通過 WindowManager 的addView、removeView、updateViewLayout這三個方法來管理View,WindowManager本質(zhì)是接口,最終由WindowManagerImpl實現(xiàn)。
延伸:
WindowManager為每個Window創(chuàng)建Surface對象,然后應用就可以通過這個Surface來繪制任何它想要繪制的東西。而對于WindowManager來說,這只不過是一塊矩形區(qū)域而已。
Surface其實就是一個持有像素點矩陣的對象,這個像素點矩陣是組成顯示在屏幕的圖像的一部分。我們看到顯示的每個Window(包括對話框、全屏的Activity、狀態(tài)欄等)都有他自己繪制的Surface。而最終的顯示可能存在Window之間遮擋的問題,此時就是通過SurfaceFlinger對象渲染最終的顯示,使他們以正確的Z-order顯示出來。一般Surface擁有一個或多個緩存(一般2個),通過雙緩存來刷新,這樣就可以一邊繪制一邊加新緩存。
點擊播放 GIF 0.0M
View是Window里面用于交互的UI元素。Window只attach一個View Tree(組合模式),當Window需要重繪(如,當View調(diào)用invalidate)時,最終轉(zhuǎn)為Window的Surface,Surface被鎖住(locked)并返回Canvas對象,此時View拿到Canvas對象來繪制自己。當所有View繪制完成后,Surface解鎖(unlock),并且post到繪制緩存用于繪制,通過Surface Flinger來組織各個Window,顯示最終的整個屏幕
7、橫豎屏切換的Activity生命周期變化?
不設置Activity的android:configChanges時,切屏會銷毀當前Activity,然后重新加載調(diào)用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次;
onPause() onStop()onDestory()onCreate()onStart()onResume()
設置Activity的android:configChanges="orientation",經(jīng)過機型測試:
在Android5.1 即API 23級別下,切屏還是會重新調(diào)用各個生命周期,切橫、豎屏時只會執(zhí)行一次
在Android9 即API 28級別下,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法
后經(jīng)官方查正,原話如下:如果您的應用面向Android 3.2即API 級別 13或更高級別(按照 minSdkVersion 和 targetSdkVersion 屬性所聲明的級別),則還應聲明 "screenSize" 配置,因為當設備在橫向與縱向之間切換時,該配置也會發(fā)生變化。即便是在 Android 3.2 或更高版本的設備上運行,此配置變更也不會重新啟動 Activity
設置Activity的android:configChanges="orientation|keyboardHidden|screenSize"時,機型測試通過,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法;
8、如何啟動其他應用的Activity?
在保證有權限訪問的情況下,通過隱式Intent進行目標Activity的IntentFilter匹配,原則是:
一個intent只有同時匹配某個Activity的intent-filter中的action、category、data才算完全匹配,才能啟動該Activity;
一個Activity可以有多個 intent-filter,一個 intent只要成功匹配任意一組 intent-filter,就可以啟動該Activity;
9、Activity的啟動過程?(重點)
點擊App圖標后通過startActivity遠程調(diào)用到AMS中,AMS中將新啟動的activity以activityrecord的結構壓入activity棧中,并通過遠程binder回調(diào)到原進程,使得原進程進入pause狀態(tài),原進程pause后通知AMS我pause了
此時AMS再根據(jù)棧中Activity的啟動intent中的flag是否含有new_task的標簽判斷是否需要啟動新進程,啟動新進程通過startProcessXXX的函數(shù)
啟動新進程后通過反射調(diào)用ActivityThread的main函數(shù),main函數(shù)中調(diào)用looper.prepar和lopper.loop啟動消息隊列循環(huán)機制。最后遠程告知AMS我啟動了。AMS回調(diào)handleLauncherAcitivyt加載activity。在handlerLauncherActivity中會通過反射調(diào)用Application的onCreate和activity的onCreate以及通過handleResumeActivity中反射調(diào)用Activity的onResume
Fragment
1、談一談Fragment的生命周期?
Fragment從創(chuàng)建到銷毀整個生命周期中涉及到的方法依次為:onAttach()onCreate() onCreateView()onActivityCreated()onStart()onResume()onPause()onStop()onDestroyView()onDestroy()onDetach(),其中和Activity有不少名稱相同作用相似的方法,而不同的方法有:
onAttach():當Fragment和Activity建立關聯(lián)時調(diào)用;
onCreateView():當fragment創(chuàng)建視圖調(diào)用,在onCreate之后;
onActivityCreated():當與Fragment相關聯(lián)的Activity完成onCreate()之后調(diào)用;
onDestroyView():在Fragment中的布局被移除時調(diào)用;
onDetach():當Fragment和Activity解除關聯(lián)時調(diào)用;
總結
以上是生活随笔為你收集整理的android翻盘效果,行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机2级什么时间考,全国计算机2级考试
- 下一篇: python编辑学生分数_python处