站長資訊網
        最全最豐富的資訊網站

        Android面試題之四大組件篇

        推薦:《2020年Android面試題大匯總【收藏】》

        Android面試題(四大組件篇)

        window、進程、線程篇

        Android面試題(數據存儲、view篇)

        Activity

        Q:說下Activity的生命周期?

        Android面試題之四大組件篇

        Q:onStart()和onResume()/onPause()和onStop()的區別?

        是否位于前臺,對用戶是否可見的區別

        Q:Activity A啟動另一個Activity B會回調哪些方法?如果Activity B是完全透明呢?如果啟動的是一個Dialog呢?

        A會回調onPause()>>onStop(),透明則不會調用onStop(),對話框則不會調用onPause()和onStop()

        Q:談談onSaveInstanceState()方法?何時會調用?

        當Activity意外銷毀時再重新創建時會調用此方法,比如橫豎屏切換,會導致重新創建Activity,onSaveInstanceState()方法的調用在onStop()之前,用于保存當前Activity的狀態,當Activity被重新創建后,會調用onRestoreInstanceState()來恢復Activity的狀態,onRestoreInstanceState()的調用在onStart()之前。

        Q:onSaveInstanceState()與onPause()的區別?

        兩者執行沒有固定的先后順序。

        onsavedinstance(Bundle savedinstancestate)方法的觸發時機,其典型的情景是按home鍵或者切換activity,這樣的activity可能被銷毀的場合,但是按back鍵退出程序,則不會調用此方法,適合保存一些非持久性的數據(即程序運行期間需要儲存的數據)。

        而onpause(),不管是可能銷毀還是退出程序,都必須調用,適合保存持久性的數據,但是android本身沒有為此方法提供bundle參數,因此我們可以選用做一個靜態變量或者是提供一個sharedpreference作為數據載體。

        Q:如何避免配置改變時Activity重建?

        在清單文件下每個activity注冊時寫上

        android:configChanges=“XXX”

        比如橫豎屏切換:android:configChanges=“orientation”

        Q:優先級低的Activity在內存不足被回收后怎樣做可以恢復到銷毀前狀態?

        1.當app處于后臺被系統回收時,app的進程被殺死了,Activity 也被回收了,而app的task和activity棧以及相應的intent和數據會被系統保存起來。當app被切回前臺時,系統會恢復task和activity棧以及相應的intent和數據。
        2.不要在Application類和全局單例類中存放數據,會導致app無法正確恢復狀態。運行時的臨時數據應存放在SharedPreference、臨時文件或數據庫中
        3 Activity之間傳數據應該用系統提供的intent機制。

        Q:說下Activity的四種啟動模式?(有時會出個實際問題來分析返回棧中Activity的情況)

        https://blog.csdn.net/mountain_hua/article/details/81481242

        Q:談談singleTop和singleTask的區別以及應用場景

        棧頂復用:解決重復打開Activity的問題。

        棧內復用:當一個任務棧要調用另一個程序的Activity的時候,如下:

        Android面試題之四大組件篇

        Q:onNewIntent()調用時機?

        當進行singleTop和singleTask模式的時候,存在對應的Activity,即會調用該Activity的onNewIntent()。

        Q:了解哪些Activity啟動模式的標記位?

        Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //指定singleTask模式,與在AndroidManifest.xml中指定android:launchMode"singleTask"效果相同

        Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        //指定singleTop模式,與在AndroidManifest.xml中指定android:launchMode"singleTop"效果相同

        Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        //具有這個標志的Activity啟動時,在同一個任務棧中所以位于它上面的Activity都要出棧,一般會和singleTask模式一起出現

        Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        //具有這個標志的Activity不會出現在歷史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents="true"
        標記位優先級比在AndroidManifest中指定優先級高

        Q:如何啟動其他應用的Activity?

        SingleTask和taskAfiinity配合使用

        Q:Activity的啟動過程?

        https://www.jianshu.com/p/9ecea420eb52

        Fragment

        Q:談一談Fragment的生命周期?

        Android面試題之四大組件篇

        下圖很好的描述了 Fragment 與 Activity 生命周期的關系

        Q:Activity和Fragment的異同?

        1、從最基礎的開始說—>生命周期

        Activity有7個生命周期:onCreate(); onStart(); onResume(); onPause(); onStop(); onDestroy(); onRestart();

        Fragment有11個生命周期:onAttach(); onCreate(); onCreateView(); onActivityCreate(); onStart(); onResume(); onPause(); onStop(); onDestroyView(); onDestroy(); onDetach();

        所以Fragment比較與Activity來說會更加靈活,因為生命周期多了,你可以控制的地方也就多了。

        2、從靈活性上來說

        Activity是四大組件之一,是每個頁面的承載,一個就是一個,Fragment的顯示要依賴于Activity,從Fragment的生命周期中就可以了解到。

        Fragment是一個一個的小碎片

        1)相比較與Activity來說更加靈活,可以在XML文件中直接進行寫入,也可以在Activity中動態添加;

        2)可以使用show()/hide()或者replace()隨時對Fragment進行切換,并且切換的時候不會出現明顯的效果,用戶體驗會好;Activity雖然也可以進行切換,但是Activity之間切換會有明顯的翻頁或者其他的效果,在小部分內容的切換上給用戶的感覺不是很好

        Q:Activity和Fragment的關系?

        Fragment的顯示要依賴于Activity,從Fragment的生命周期中就可以了解到。

        Q:何時會考慮使用Fragment?

        類似微信下方菜單欄,以及手機和平板適配等

        Service

        Q:談一談Service的生命周期?

        https://www.cnblogs.com/huihuizhang/p/7623760.html

        Android面試題之四大組件篇

        Q:Service的兩種啟動方式?區別在哪?

        start是直接啟動,bound是與當前activity綁定。

        Q:一個Activty先start一個Service后,再bind時會回調什么方法?此時如何做才能回調Service的destory()方法?

        如果一個Service又被啟動又被綁定,則該Service將會一直在后臺運行。并且不管如何調用,onCreate始終只會調用一次,對應startService調用多少次,Service的onStart便會調用多少次。調用unbindService將不會停止Service,而必須調用 stopService 或 Service的 stopSelf 來停止服務。

        Q:Service如何和Activity進行通信?

        1. Activity調用bindService (Intent service, ServiceConnection conn, int flags)方法,得到Service對象的一個引用,這樣Activity可以直接調用到Service中的方法,如果要主動通知Activity,我們可以利用回調方法
        2. Service向Activity發送消息,可以使用廣播,當然Activity要注冊相應的接收器。比如Service要向多個Activity發送同樣的消息的話,用這種方法就更好

        Q:用過哪些系統Service?

        https://blog.csdn.net/geyunfei_/article/details/78851024

        Android面試題之四大組件篇

        Q:是否能在Service進行耗時操作?如果非要可以怎么做?

        Service是運行在主線程中的,一般不能在Service進行耗時操作,如果非要,可以使用遠程Service開啟新進程。

        Q:AlarmManager能實現定時的原理?

        AlarmManager提供對系統警報服務的訪問。這些允許您在將來的某個時間點運行應用程序。當警報響起時,系統會廣播已注冊的意圖,如果目標應用程序尚未運行,則自動啟動它。當設備處于休眠狀態時,會保留已注冊的警報(如果設備在此期間發生故障,可以選擇將其喚醒),但如果設備被關閉并重新啟動,則會清除該警報。警報管理器持有一個CPU喚醒鎖,只要警報接收器的onReceive()方法正在執行。這保證了在你處理完廣播后,手機才會休眠。一旦onReceive()返回,警報管理器將釋放此喚醒鎖。這意味著,在某些情況下,只要onReceive()方法完成,手機就會休眠。如果您的警報接收器調用Context.startService(),那么在啟動所請求的服務之前,手機可能會休眠。為了防止這種情況發生,您的BroadcastReceiver和Service將需要實現一個單獨的喚醒鎖定策略,以確保在服務可用之前繼續運行電話。

        Q:前臺服務是什么?和普通服務的不同?如何去開啟一個前臺服務?

        前臺服務即對用戶可見的服務,可以以通知的形式創建前臺服務

        Q:是否了解ActivityManagerService,談談它發揮什么作用?

        ActivityManagerService(以后簡稱AMS)Android中最核心的服務 , 主要負責系統中四大組件的啟動、切換、調度及應用進程的管理和調度等工作,其職責與操作系統中的進程管理和調度模塊類似,因此它在Android中非常重要

        Q:如何保證Service不被殺死?

        onStartCommand方法中,返回START_STICKY

        StartCommand()幾個常量:

        • START_STICKY
          系統重新創建服務并且調用onStartCommand()方法,但并不會傳遞最后一次傳遞的intent,只是傳遞一個空的intent。除非存在將要傳遞來的intent,那么就會傳遞這些intent。這個適合播放器一類的服務,不需要執行命令,只需要獨自運行,等待任務。
        • START_NOT_STICKY
          系統不重新創建服務,除非有將要傳遞來的intent。這是最安全的選項,可以避免在不必要的時候運行服務。
        • START_REDELIVER_INTENT
          系統重新創建服務并且調用onStartCommand()方法,傳遞最后一次傳遞的intent。其余存在的需要傳遞的intent會按順序傳遞進來。這適合像下載一樣的服務,立即恢復,積極執行。

        提升Service優先級

        前臺服務是被認為用于已知的正在運行的服務,當系統需要釋放內存時不會優先殺掉該進程。

        在onDestory()中發送廣播開啟自己

        service+broadcast方式,就是當service調用到ondestory()的時候,發送一個自定義的廣播,當收到廣播的時候,重新啟動service。當然,從理論上來講這個方案是可行的,實驗一下結果也是可行的。但是有些情況下,發送的廣播在消息隊列中排的靠后,就有可能服務還沒有接收到廣播就銷毀了(只是猜想)。所以為了能讓這個機制完美運行,可以開啟兩個服務,相互監聽,相互啟動。服務A監聽B的廣播來啟動B,服務B監聽A的廣播來啟動A。經過實驗,這個方案是可行的。

        Broadcast Receiver

        Q:廣播的兩種注冊形式?區別在哪?

        廣播接收者的注冊有兩種方法,分別是程序動態注冊和AndroidManifest文件中進行靜態注冊。

        動態注冊廣播接收器特點是當用來注冊的Activity關掉后,廣播也就失效了。靜態注冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用。

        ContentProvider

        Q:ContentProvider了解多少?

        (1)android平臺提供了ContentProvider使一個應用程序的指定數據集提供給其他應用程序。其他應用可以通過ContentResolver類從該內容提供者中獲取或存入數據。

        (2)只有需要在多個應用程序間共享數據是才需要內容提供者。例如,通訊錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。它的好處是統一數據訪問方式。

        (3)ContentProvider實現數據共享。ContentProvider用于保存和獲取數據,并使其對所有應用程序可見。這是不同應用程序間共享數據的唯一方式,因為android沒有提供所有應用共同訪問的公共存儲區。

        (4)開發人員不會直接使用ContentProvider類的對象,大多數是通過ContentResolver對象實現對ContentProvider的操作。

        (5)ContentProvider使用URI來唯一標識其數據集,這里的URI以content://作為前綴,表示該數據由ContentProvider來管理。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 91亚洲国产成人久久精品| 亚洲国产精品人久久| 中国精品18videosex性中国| 久久成人精品视频| 人妻精品久久无码专区精东影业 | 国产成人精品日本亚洲18图| 亚洲中文字幕久久精品无码APP | 久久久久亚洲精品无码网址| 亚洲精品小视频| 999在线视频精品免费播放观看| 亚洲国产精品一区二区成人片国内 | 国产欧美日韩精品专区| 久久er热视频在这里精品| 精品不卡一区二区| 无码国内精品久久人妻蜜桃| 无码日韩精品一区二区人妻 | 国产在线精品一区二区不卡| 精品无码人妻一区二区免费蜜桃| 亚洲精品国产成人片| 亚洲精品无码日韩国产不卡?V| 国产一区二区精品久久岳| 国产精品免费久久久久久久久| 北条麻妃国产九九九精品视频| 日本一区二区三区精品中文字幕| 国产在线精品网址你懂的| 久久精品一区二区三区不卡| 国产精品久久久久久久久鸭| 精品国产自在在线在线观看| 欧美精品国产日韩综合在线| 先锋影音国产精品| 国产高清在线精品一本大道国产| 93精91精品国产综合久久香蕉| 亚洲国产精品线在线观看| 国产观看精品一区二区三区| 精品无码国产自产拍在线观看蜜| 久久精品夜色噜噜亚洲A∨| 日韩精品毛片| 亚洲爆乳精品无码一区二区三区| 无码国产精品一区二区免费16| 久久精品aⅴ无码中文字字幕重口| 久久精品无码午夜福利理论片|