日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android翻盘效果,行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...

發布時間:2024/9/27 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android翻盘效果,行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

碼個蛋(codeegg) 第 905 次推文

作者:夜貓少年

鏈接:https://juejin.im/post/5c8211fee51d453a136e36b0

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之后;

官方文檔(https://developer.android.com/training/basics/activity-lifecycle/recreating.html?hl=zh-cn)

4、說下 Activity的四種啟動模式、應用場景 ?

standard標準模式:每次啟動一個Activity都會重新創建一個新的實例,不管這個實例是否已經存在,此模式的Activity默認會進入啟動它的Activity所屬的任務棧中;

singleTop棧頂復用模式:如果新Activity已經位于任務棧的棧頂,那么此Activity不會被重新創建,同時會回調onNewIntent方法,如果新Activity實例已經存在但不在棧頂,那么Activity依然會被重新創建;

singleTask棧內復用模式:只要Activity在一個任務棧中存在,那么多次啟動此Activity都不會重新創建實例,并回調onNewIntent方法,此模式啟動Activity A,系統首先會尋找是否存在A想要的任務棧,如果不存在,就會重新創建一個任務棧,然后把創建好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模式一起出現,在這種情況下,被啟動Activity的實例如果已經存在,那么系統就會回調onNewIntent。如果被啟動的Activity采用standard模式啟動,那么它以及連同它之上的Activity都要出棧,系統會創建新的Activity實例并放入棧中;

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具有這個標記的 Activity 不會出現在歷史 Activity 列表中;

官方文檔(https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=zh-CN)

6、說下 Activity跟window,view之間的關系?

Activity在創建時會調用 attach() 方法初始化一個PhoneWindow(繼承于Window),每一個Activity都包含了唯一一個PhoneWindow。

Activity通過setContentView實際上是調用的 getWindow().setContentView將View設置到PhoneWindow上,而PhoneWindow內部是通過 WindowManager 的addView、removeView、updateViewLayout這三個方法來管理View,WindowManager本質是接口,最終由WindowManagerImpl實現。

延伸:

WindowManager為每個Window創建Surface對象,然后應用就可以通過這個Surface來繪制任何它想要繪制的東西。而對于WindowManager來說,這只不過是一塊矩形區域而已。

Surface其實就是一個持有像素點矩陣的對象,這個像素點矩陣是組成顯示在屏幕的圖像的一部分。我們看到顯示的每個Window(包括對話框、全屏的Activity、狀態欄等)都有他自己繪制的Surface。而最終的顯示可能存在Window之間遮擋的問題,此時就是通過SurfaceFlinger對象渲染最終的顯示,使他們以正確的Z-order顯示出來。一般Surface擁有一個或多個緩存(一般2個),通過雙緩存來刷新,這樣就可以一邊繪制一邊加新緩存。

點擊播放 GIF 0.0M

View是Window里面用于交互的UI元素。Window只attach一個View Tree(組合模式),當Window需要重繪(如,當View調用invalidate)時,最終轉為Window的Surface,Surface被鎖住(locked)并返回Canvas對象,此時View拿到Canvas對象來繪制自己。當所有View繪制完成后,Surface解鎖(unlock),并且post到繪制緩存用于繪制,通過Surface Flinger來組織各個Window,顯示最終的整個屏幕

7、橫豎屏切換的Activity生命周期變化?

不設置Activity的android:configChanges時,切屏會銷毀當前Activity,然后重新加載調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次;

onPause() onStop()onDestory()onCreate()onStart()onResume()

設置Activity的android:configChanges="orientation",經過機型測試:

在Android5.1 即API 23級別下,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次

在Android9 即API 28級別下,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

后經官方查正,原話如下:如果您的應用面向Android 3.2即API 級別 13或更高級別(按照 minSdkVersion 和 targetSdkVersion 屬性所聲明的級別),則還應聲明 "screenSize" 配置,因為當設備在橫向與縱向之間切換時,該配置也會發生變化。即便是在 Android 3.2 或更高版本的設備上運行,此配置變更也不會重新啟動 Activity

設置Activity的android:configChanges="orientation|keyboardHidden|screenSize"時,機型測試通過,切屏不會重新調用各個生命周期,只會執行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遠程調用到AMS中,AMS中將新啟動的activity以activityrecord的結構壓入activity棧中,并通過遠程binder回調到原進程,使得原進程進入pause狀態,原進程pause后通知AMS我pause了

此時AMS再根據棧中Activity的啟動intent中的flag是否含有new_task的標簽判斷是否需要啟動新進程,啟動新進程通過startProcessXXX的函數

啟動新進程后通過反射調用ActivityThread的main函數,main函數中調用looper.prepar和lopper.loop啟動消息隊列循環機制。最后遠程告知AMS我啟動了。AMS回調handleLauncherAcitivyt加載activity。在handlerLauncherActivity中會通過反射調用Application的onCreate和activity的onCreate以及通過handleResumeActivity中反射調用Activity的onResume

Fragment

1、談一談Fragment的生命周期?

Fragment從創建到銷毀整個生命周期中涉及到的方法依次為:onAttach()onCreate() onCreateView()onActivityCreated()onStart()onResume()onPause()onStop()onDestroyView()onDestroy()onDetach(),其中和Activity有不少名稱相同作用相似的方法,而不同的方法有:

onAttach():當Fragment和Activity建立關聯時調用;

onCreateView():當fragment創建視圖調用,在onCreate之后;

onActivityCreated():當與Fragment相關聯的Activity完成onCreate()之后調用;

onDestroyView():在Fragment中的布局被移除時調用;

onDetach():當Fragment和Activity解除關聯時調用;

總結

以上是生活随笔為你收集整理的android翻盘效果,行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。