站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        Android面試題之四大組件篇

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

        Android面試題(四大組件篇)

        window、進(jìn)程、線程篇

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

        Activity

        Q:說下Activity的生命周期?

        Android面試題之四大組件篇

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

        是否位于前臺,對用戶是否可見的區(qū)別

        Q:Activity A啟動(dòng)另一個(gè)Activity B會(huì)回調(diào)哪些方法?如果Activity B是完全透明呢?如果啟動(dòng)的是一個(gè)Dialog呢?

        A會(huì)回調(diào)onPause()>>onStop(),透明則不會(huì)調(diào)用onStop(),對話框則不會(huì)調(diào)用onPause()和onStop()

        Q:談?wù)刼nSaveInstanceState()方法?何時(shí)會(huì)調(diào)用?

        當(dāng)Activity意外銷毀時(shí)再重新創(chuàng)建時(shí)會(huì)調(diào)用此方法,比如橫豎屏切換,會(huì)導(dǎo)致重新創(chuàng)建Activity,onSaveInstanceState()方法的調(diào)用在onStop()之前,用于保存當(dāng)前Activity的狀態(tài),當(dāng)Activity被重新創(chuàng)建后,會(huì)調(diào)用onRestoreInstanceState()來恢復(fù)Activity的狀態(tài),onRestoreInstanceState()的調(diào)用在onStart()之前。

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

        兩者執(zhí)行沒有固定的先后順序。

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

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

        Q:如何避免配置改變時(shí)Activity重建?

        在清單文件下每個(gè)activity注冊時(shí)寫上

        android:configChanges=“XXX”

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

        Q:優(yōu)先級低的Activity在內(nèi)存不足被回收后怎樣做可以恢復(fù)到銷毀前狀態(tài)?

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

        Q:說下Activity的四種啟動(dòng)模式?(有時(shí)會(huì)出個(gè)實(shí)際問題來分析返回棧中Activity的情況)

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

        Q:談?wù)剆ingleTop和singleTask的區(qū)別以及應(yīng)用場景

        棧頂復(fù)用:解決重復(fù)打開Activity的問題。

        棧內(nèi)復(fù)用:當(dāng)一個(gè)任務(wù)棧要調(diào)用另一個(gè)程序的Activity的時(shí)候,如下:

        Android面試題之四大組件篇

        Q:onNewIntent()調(diào)用時(shí)機(jī)?

        當(dāng)進(jìn)行singleTop和singleTask模式的時(shí)候,存在對應(yīng)的Activity,即會(huì)調(diào)用該Activity的onNewIntent()。

        Q:了解哪些Activity啟動(dòng)模式的標(biāo)記位?

        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);
        //具有這個(gè)標(biāo)志的Activity啟動(dòng)時(shí),在同一個(gè)任務(wù)棧中所以位于它上面的Activity都要出棧,一般會(huì)和singleTask模式一起出現(xiàn)

        Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        //具有這個(gè)標(biāo)志的Activity不會(huì)出現(xiàn)在歷史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents="true"
        標(biāo)記位優(yōu)先級比在AndroidManifest中指定優(yōu)先級高

        Q:如何啟動(dòng)其他應(yīng)用的Activity?

        SingleTask和taskAfiinity配合使用

        Q:Activity的啟動(dòng)過程?

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

        Fragment

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

        Android面試題之四大組件篇

        下圖很好的描述了 Fragment 與 Activity 生命周期的關(guān)系

        Q:Activity和Fragment的異同?

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

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

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

        所以Fragment比較與Activity來說會(huì)更加靈活,因?yàn)樯芷诙嗔耍憧梢钥刂频牡胤揭簿投嗔恕?/p>

        2、從靈活性上來說

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

        Fragment是一個(gè)一個(gè)的小碎片

        1)相比較與Activity來說更加靈活,可以在XML文件中直接進(jìn)行寫入,也可以在Activity中動(dòng)態(tài)添加;

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

        Q:Activity和Fragment的關(guān)系?

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

        Q:何時(shí)會(huì)考慮使用Fragment?

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

        Service

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

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

        Android面試題之四大組件篇

        Q:Service的兩種啟動(dòng)方式?區(qū)別在哪?

        start是直接啟動(dòng),bound是與當(dāng)前activity綁定。

        Q:一個(gè)Activty先start一個(gè)Service后,再bind時(shí)會(huì)回調(diào)什么方法?此時(shí)如何做才能回調(diào)Service的destory()方法?

        如果一個(gè)Service又被啟動(dòng)又被綁定,則該Service將會(huì)一直在后臺運(yùn)行。并且不管如何調(diào)用,onCreate始終只會(huì)調(diào)用一次,對應(yīng)startService調(diào)用多少次,Service的onStart便會(huì)調(diào)用多少次。調(diào)用unbindService將不會(huì)停止Service,而必須調(diào)用 stopService 或 Service的 stopSelf 來停止服務(wù)。

        Q:Service如何和Activity進(jìn)行通信?

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

        Q:用過哪些系統(tǒng)Service?

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

        Android面試題之四大組件篇

        Q:是否能在Service進(jìn)行耗時(shí)操作?如果非要可以怎么做?

        Service是運(yùn)行在主線程中的,一般不能在Service進(jìn)行耗時(shí)操作,如果非要,可以使用遠(yuǎn)程Service開啟新進(jìn)程。

        Q:AlarmManager能實(shí)現(xiàn)定時(shí)的原理?

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

        Q:前臺服務(wù)是什么?和普通服務(wù)的不同?如何去開啟一個(gè)前臺服務(wù)?

        前臺服務(wù)即對用戶可見的服務(wù),可以以通知的形式創(chuàng)建前臺服務(wù)

        Q:是否了解ActivityManagerService,談?wù)勊l(fā)揮什么作用?

        ActivityManagerService(以后簡稱AMS)Android中最核心的服務(wù) , 主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊類似,因此它在Android中非常重要

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

        onStartCommand方法中,返回START_STICKY

        StartCommand()幾個(gè)常量:

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

        提升Service優(yōu)先級

        前臺服務(wù)是被認(rèn)為用于已知的正在運(yùn)行的服務(wù),當(dāng)系統(tǒng)需要釋放內(nèi)存時(shí)不會(huì)優(yōu)先殺掉該進(jìn)程。

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

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

        Broadcast Receiver

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

        廣播接收者的注冊有兩種方法,分別是程序動(dòng)態(tài)注冊和AndroidManifest文件中進(jìn)行靜態(tài)注冊。

        動(dòng)態(tài)注冊廣播接收器特點(diǎn)是當(dāng)用來注冊的Activity關(guān)掉后,廣播也就失效了。靜態(tài)注冊無需擔(dān)憂廣播接收器是否被關(guān)閉,只要設(shè)備是開啟狀態(tài),廣播接收器也是打開著的。也就是說哪怕app本身未啟動(dòng),該app訂閱的廣播在觸發(fā)時(shí)也會(huì)對它起作用。

        ContentProvider

        Q:ContentProvider了解多少?

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

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

        (3)ContentProvider實(shí)現(xiàn)數(shù)據(jù)共享。ContentProvider用于保存和獲取數(shù)據(jù),并使其對所有應(yīng)用程序可見。這是不同應(yīng)用程序間共享數(shù)據(jù)的唯一方式,因?yàn)閍ndroid沒有提供所有應(yīng)用共同訪問的公共存儲區(qū)。

        (4)開發(fā)人員不會(huì)直接使用ContentProvider類的對象,大多數(shù)是通過ContentResolver對象實(shí)現(xiàn)對ContentProvider的操作。

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

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产成人精品999在线观看| 国产成人精品日本亚洲专区 | 偷拍精品视频一区二区三区| 国产精品v欧美精品v日韩精品 | 中文字幕精品视频| 亚洲一区精品无码| 久久久WWW免费人成精品| 99riav国产精品| 国产精品福利在线观看| 中国精品18videosex性中国| 久久乐国产精品亚洲综合| 国产精品hd免费观看| 亚洲国产精品久久久久网站| 99麻豆久久久国产精品免费| 国产麻豆精品一区二区三区v视界| 中文国产成人精品久久不卡| 欧美日韩精品| 久久精品亚洲福利| 国产乱人伦偷精品视频 | 亚洲精品线路一在线观看| 国产亚洲精品激情都市| 欧美精品香蕉在线观看网| 99精品国产丝袜在线拍国语| 精品久久人妻av中文字幕| 少妇人妻精品一区二区三区| 亚洲国产精品人人做人人爱| 久久国产精品免费一区| 国产午夜福利精品久久| 国产精品自在欧美一区 | 合区精品中文字幕| 日本五区在线不卡精品| 国产一区麻豆剧传媒果冻精品| 国产在线精品一区二区高清不卡| 国产精品成人h片在线| 国产精品推荐天天看天天爽| 国产精品无码久久综合网| 国产在线精品福利大全| 久久久久亚洲精品无码网址| 日韩欧美一区二区三区中文精品| 久久久久亚洲精品天堂久久久久久 | 杨幂国产精品福利在线观看|