首頁 >web前端 >前端問答 >Android面試題之四大組件篇

Android面試題之四大組件篇

藏色散人
藏色散人轉載
2020-07-31 14:27:084625瀏覽

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

Android面試題(四大組件篇)

window、行程、執行緒篇

Android面試題(資料儲存、view篇)

 

Activity




# Q:說下Activity的生命週期?


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的時候,如下:





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);##dIntent.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的生命週期?

下圖很好的描述了 Fragment 與 Activity 生命週期的關係

Q:Activity和Fragment的異同?

1、從最基礎的開始說--->生命週期

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

Fragment有11個生命週期:onAttach(); onCreate(); onCreateView(); onActivityCreate(); onStart(); onResume(); onPauseume(); (); 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


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要註冊對應的接收器。例如Service要傳送相同的訊息給多個Activity的話,用這種方法就更好

 

Q:用過哪些系統Service?

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


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<strong></strong>

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來管理。

 

以上是Android面試題之四大組件篇的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除