<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## Android篇 ### 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://img.kancloud.cn/3d/c9/3dc98c622369f9d2facb0965ec582733_583x381.jpg) > > * 推薦文章: > * [使用 onSaveInstanceState() 保存簡單輕量的界面狀態](https://developer.android.google.cn/guide/components/activities/activity-lifecycle#save-simple,-lightweight-ui-state-using-onsaveinstancestate) > * [使用保存的實例狀態恢復 Activity 界面狀態](https://developer.android.google.cn/guide/components/activities/activity-lifecycle#restore-activity-ui-state-using-saved-instance-state) > * [官方文檔](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.google.cn/guide/components/activities/tasks-and-back-stack#TaskLaunchModes) > * [官方文檔](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 列表中; > * 推薦文章: > * [使用 Intent 標記](https://developer.android.google.cn/guide/components/activities/tasks-and-back-stack#IntentFlagsForTasks) > * [官方文檔](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根Window。** > * Activity通過**setContentView**實際上是調用的 **getWindow().setContentView**將View設置到PhoneWindow上,而PhoneWindow內部是通過 **WindowManager** 的**addView**、**removeView**、**updateViewLayout**這三個方法來管理View,**WindowManager本質是接口,最終由WindowManagerImpl實現** > * WMS則是管理Activiy所相應的窗口系統(系統窗口以及嵌套的子窗口); > * SurfaceFlinger則是將應用UI繪制到frameBuffer(幀緩沖區),最終由硬件完成渲染到屏幕上; > * 延伸 > * **WindowManager**為每個**Window**創建**Surface**對象,然后應用就可以通過這個**Surface**來繪制任何它想要繪制的東西。而對于**WindowManager**來說,這只不過是一塊矩形區域而已 > * **Surface**其實就是一個持有像素點矩陣的對象,這個像素點矩陣是組成顯示在屏幕的圖像的一部分。我們看到顯示的每個**Window**(包括對話框、全屏的**Activity**、狀態欄等)都有他自己繪制的**Surface**。而最終的顯示可能存在**Window**之間遮擋的問題,此時就是通過**SurfaceFlinger**對象渲染最終的顯示,使他們以正確的**Z-order**顯示出來。**一般Surface擁有一個或多個緩存(一般2個),通過雙緩存來刷新,這樣就可以一邊繪制一邊加新緩存**。 > * **View**是**Window**里面用于交互的**UI**元素。**Window**只**attach**一個**View Tree(組合模式)**,當**Window**需要重繪(如,當**View**調用**invalidate**)時,最終轉為**Window**的**Surface**,**Surface**被鎖住(**locked**)并返回**Canvas**對象,此時**View**拿到**Canvas**對象來繪制自己。當所有**View**繪制完成后,**Surface**解鎖(**unlock**),并且**post**到繪制緩存用于繪制,通過**Surface Flinger**來組織各個**Window**,顯示最終的整個屏幕 > * 推薦文章: > * [Android 群英傳讀書筆記第三章控件架構與自定義控件詳解](http://www.hmoore.net/alex_wsc/heros/156870) > * [Android 中window 、view、 Activity的關系](http://www.hmoore.net/alex_wsc/android/344868) > * [簡述Activity與Window關系](http://www.hmoore.net/alex_wsc/androidsystem/483890) > * [Activity、View、Window的理解一篇文章就夠了](https://blog.csdn.net/zane402075316/article/details/69822438) #### 7、橫豎屏切換的Activity生命周期變化? > * 參考回答: > * **不設置**Activity的android:configChanges時,切屏會銷毀當前Activity,然后重新加載調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次; onPause() →onStop()→onDestory()→onCreate()→onStart()→onResume() > * 設置Activity的android:configChanges="**orientation**",經過機型測試 > * **在Android5.1 即API 23級別下**,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次 > * **在Android9 即API 28級別下**,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法 > * **[后經官方查正](https://developer.android.google.cn/guide/topics/manifest/activity-element#config)**,原話如下 > * 如果您的應用面向的是**Android 3.2即API 級別 13**或更高級別(按照 minSdkVersion 和 targetSdkVersion 屬性所聲明的級別),則還應聲明 "screenSize" 配置,因為當設備在橫向與縱向之間切換時,該配置也會發生變化。即便是在 Android 3.2 或更高版本的設備上運行,此配置變更也不會重新啟動 Activity > * 設置Activity的android:configChanges="**orientation|keyboardHidden|screenSize**"時,機型測試通過,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法; > * 推薦文章: > * [Android 橫豎屏切換加載不同的布局](https://blog.csdn.net/u010365819/article/details/76618443) #### 8、如何啟動其他應用的Activity? > * 參考回答: > * 在保證有權限訪問的情況下,通過隱式Intent進行目標Activity的IntentFilter匹配的話,原則是: > * 一個intent只有同時匹配某個Activity的intent-filter中的action、category、data才算完全匹配,才能啟動該Activity; > * 一個Activity可以有多個 intent-filter,一個 intent只要成功匹配任意一組 intent-filter,就可以啟動該Activity; > * 推薦文章: > * [接收隱式 Intent](https://developer.android.google.cn/guide/components/intents-filters#Receiving) > * [你必須弄懂的Intent Filter匹配規則](https://blog.csdn.net/mynameishuangshuai/article/details/51673273) #### 9、Activity的啟動過程?(重點) > * 參考回答: > * **?先還是得知道當前系統中有沒有擁有這個Application的進程。如果沒有,則需要處理 APP 的啟動過程。在經過創建進程、綁定 Application 步驟后,才真正開始調用啟動 Activity 的?法。 startActivity() 方法,或者還是調? startActivityForResult()。** > * **在 startActivityForResult() 中,真正去打開 Activity 的實現是在 [Instrumentation](https://www.androidos.net.cn/android/7.1.1_r28/xref/frameworks/base/core/java/android/app/Instrumentation.java) 的 execStartActivivity() 方法中。** > * **在 execStartActivity() 中采? checkStartActivityResult() 檢查在 manifest 中是否已經注冊,如果沒有注冊則拋出異常(ActivityNotFoundException)。否則把打開 Activity 的任務交給 [ActivityThread](https://www.androidos.net.cn/android/7.1.1_r28/xref/frameworks/base/core/java/android/app/ActivityThread.java) 的內部類 ApplicationThread, 該類實現了 [IApplicationThread](https://www.androidos.net.cn/android/7.1.1_r28/xref/frameworks/base/core/java/android/app/IApplicationThread.java) (該類在API26及其以上的版本已經被取消了)接?。這個類完全搞定了 onCreate()、onStart() 等 Activity 的?命周期回調方法。** > * **在 [ApplicationThread](https://www.androidos.net.cn/android/8.0.0_r4/xref/frameworks/base/core/java/android/app/ActivityThread.java) 類中,有?個方法叫 scheduleLaunchActivity(),它可以構造?個 Activity記錄,然后發送?個消息給事先定義好的 Handler。 這個 Handler 負責根據 LAUNCH\_ACTIVITY 的類型來做不同的 Activity 啟動?式。其中有?個重要的方法 handleLaunchActivity() 。** > * **在 handleLaunchActivity() 中,會把啟動 Activity 交給 performLaunchActivity() ?法。 在 performLaunchActivity() ?法中,?先從 Intent 中解析出?標 Activity 的啟動參數,然后? ClassLoader 將?標 Activity 的類通過類名加載出來并? newInstance() (這里實際上是調用了Instrumentation的newActivity()方法,在這個方法里面調用了Class類的newInstance方法)來實例化?個對象。 創建完畢后, 開始調? Activity 的 onCreate() ?法,?此,Activity 被成功啟動。** > > ![](https://img.kancloud.cn/32/1b/321b7cc484ca9d28acfa308303ab47c2_769x581.jpg) > ![](https://img.kancloud.cn/19/f4/19f4d34f81138497b94e57caea94587d_752x748.jpg) > > * 推薦文章: > * [Android四大組件啟動機制之Activity啟動過程](https://blog.csdn.net/qq_30379689/article/details/79611217) > * [Android中高級面試題](http://www.hmoore.net/book/alex_wsc/mianshi/preview/Android中高級面試題.md)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看