Android 面試題之四大組件相關(guān)

如何判斷當(dāng)前BroadcastReceiver接受到的是有序廣播還是無(wú)序廣播

在BroadcastReceiver類(lèi)中onReceiver()方法中,可以調(diào)用boolean b=isOrderedBroadcast();該方法是BroadcastReceiver類(lèi)中提供的方法,用于高速我們當(dāng)前的接收到的廣播是否為有序廣播

在manifest和代碼中如何注冊(cè)和使用BroadcastReceiver

在清單文件中注冊(cè)廣播接收者稱為靜態(tài)注冊(cè),在代碼中注冊(cè)稱為動(dòng)態(tài)注冊(cè)。

靜態(tài)注冊(cè)的廣播接收者只要app在系統(tǒng)中運(yùn)行則一直可以接收到廣播消息,動(dòng)態(tài)注冊(cè)的廣播接收者當(dāng)注冊(cè)的Activity或者Service銷(xiāo)毀了那么就接收不到廣播了。

  • 靜態(tài)注冊(cè):在清單文件中進(jìn)行如下配置:
<receiver android:name=".BroadcastReceiver1" >
<intent-filter>
<action android:name="android.intent.action.CALL" >
</action>
</intent-filter>
</receiver>
  • 動(dòng)態(tài)態(tài)注冊(cè):在代碼中進(jìn)行如下注冊(cè)
receiver = new BroadcastReceiver(); 
IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(CALL_ACTION); 
context.registerReceiver(receiver, intentFilter);

Service系列問(wèn)題

Service本地服務(wù)及生命周期詳解

1.1 注冊(cè)Service需要注意什么

Service還是運(yùn)行在主線程當(dāng)中的,所以如果需要執(zhí)行一些復(fù)雜的邏輯操作,最好在服務(wù)的內(nèi)部手動(dòng)創(chuàng)建子線程進(jìn)行處理,否則會(huì)出現(xiàn)UI線程被阻塞的問(wèn)題

1.2 Service與Activity怎么實(shí)現(xiàn)通信(不要死記硬背,結(jié)合文章)

相關(guān)文章

Service和Activity的相互通信

  • 方法一:

      1. 添加一個(gè)繼承Binder的內(nèi)部類(lèi),并添加相應(yīng)的邏輯方法
      1. 重寫(xiě)Service的onBind方法,返回我們剛剛定義的那個(gè)內(nèi)部類(lèi)實(shí)例
      1. 重寫(xiě)ServiceConnection,onServiceConnected時(shí)調(diào)用邏輯方法 綁定服務(wù)
  • 方法二

    • 通過(guò)接口Iservice調(diào)用Service方法,使用接口調(diào)用service和直接調(diào)用其實(shí)本質(zhì)都是一樣的,只不過(guò)多了借口一個(gè)步驟

1.3 介紹源碼中Binder機(jī)制(了解)

面試問(wèn)到這個(gè),其實(shí)就是讓你說(shuō)一下binder是干什么的,Service Manager是如何成為一個(gè)守護(hù)進(jìn)程的

Binder機(jī)制

1.4 IntentService與Service的區(qū)別(intentservice的優(yōu)點(diǎn))

IntentService是Service的子類(lèi),是一個(gè)異步的,會(huì)自動(dòng)停止的服務(wù),很好解決了傳統(tǒng)的Service中處理完耗時(shí)操作忘記停止并銷(xiāo)毀Service的問(wèn)題

  • 會(huì)創(chuàng)建獨(dú)立的worker線程來(lái)處理所有的Intent請(qǐng)求;
  • 會(huì)創(chuàng)建獨(dú)立的worker線程來(lái)處理onHandleIntent()方法實(shí)現(xiàn)的代碼,無(wú)需處理多線程問(wèn)題;
  • 所有請(qǐng)求處理完成后,IntentService會(huì)自動(dòng)停止,無(wú)需調(diào)用stopSelf()方法停止Service;
  • 為Service的onBind()提供默認(rèn)實(shí)現(xiàn),返回null;
  • 為Service的onStartCommand提供默認(rèn)實(shí)現(xiàn),將請(qǐng)求Intent添加到隊(duì)列中;
  • IntentService不會(huì)阻塞UI線程,而普通Serveice會(huì)導(dǎo)致ANR異常
  • Intentservice若未執(zhí)行完成上一次的任務(wù),將不會(huì)新開(kāi)一個(gè)線程,是等待之前的任務(wù)完成后,再執(zhí)行新的任務(wù),等任務(wù)完成后再次調(diào)用stopSelf()

1.5 Service 是否在 main thread 中執(zhí)行, service 里面是否 能執(zhí)行耗時(shí)的操作?

默認(rèn)情況,如果沒(méi)有顯示的指 service 所運(yùn)行的進(jìn)程, Service 和 activity 是運(yùn) 行在當(dāng)前 app 所在進(jìn)程的 main thread(UI 主線程)里面。

service 里面不能執(zhí)行耗時(shí)的操作(網(wǎng)絡(luò)請(qǐng)求,拷貝數(shù)據(jù)庫(kù),大文件 )

特殊情況 ,可以在清單文件配置 service 執(zhí)行所在的進(jìn)程 ,讓 service 在另 外的進(jìn)程中執(zhí)行

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" >
</service>

1.6 Service的生命周期

Service 有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不同 的使用方法生命周期方法也不同。

  • 非綁定模式:當(dāng)?shù)谝淮握{(diào)用 startService 的時(shí)候執(zhí)行的方法依次為 onCreate()、onStartCommand(),當(dāng) Service 關(guān)閉的時(shí)候調(diào)用 onDestory 方 法。

  • 綁定模式:第一次 bindService()的時(shí)候,執(zhí)行的方法為 onCreate()、 onBind()解除綁定的時(shí)候會(huì)執(zhí)行 onUnbind()、onDestory()。

上面的兩種生命周期是在相對(duì)單純的模式下的情形。我們?cè)陂_(kāi)發(fā)的過(guò)程中還 必須注意 Service 實(shí)例只會(huì)有一個(gè),也就是說(shuō)如果當(dāng)前要啟動(dòng)的 Service 已經(jīng)存 在了那么就不會(huì)再次創(chuàng)建該 Service 當(dāng)然也不會(huì)調(diào)用 onCreate()方法。

一個(gè) Service 可以被多個(gè)客戶進(jìn)行綁定,只有所有的綁定對(duì)象都執(zhí)行了

onBind()方法后該 Service 才會(huì)銷(xiāo)毀,不過(guò)如果有一個(gè)客戶執(zhí)行了 onStart() 方法,那么這個(gè)時(shí)候如果所有的 bind 客戶都執(zhí)行了 unBind()該 Service 也不會(huì) 銷(xiāo)毀。

Service 的生命周期圖如下所示,幫助大家記憶。

只使用startService啟動(dòng)服務(wù)的生命周期

只使用BindService綁定服務(wù)的生命周期

同時(shí)使用startService()啟動(dòng)服務(wù)、BindService()綁定服務(wù)的生命周期

1.7 Activity、Intent、Service 是什么關(guān)系(了解)

他們都是 Android 開(kāi)發(fā)中使用頻率最高的類(lèi)。其中 Activity 和 Service 都是 Android 四大組件之一。他倆都是 Context 類(lèi)的子類(lèi) ContextWrapper 的子類(lèi), 因此他倆可以算是兄弟關(guān)系吧。不過(guò)兄弟倆各有各自的本領(lǐng),Activity 負(fù)責(zé)用戶 界面的顯示和交互,Service 負(fù)責(zé)后臺(tái)任務(wù)的處理。Activity 和 Service 之間可 以通過(guò) Intent 傳遞數(shù)據(jù),因此可以把 Intent 看作是通信使者。

1.8 Service 和 Activity 在同一個(gè)線程嗎?

對(duì)于同一 app 來(lái)說(shuō)默認(rèn)情況下是在同一個(gè)線程中的,main Thread (UI Thread)。

1.9 在 service 的生命周期方法 onstartConmand()可不可以執(zhí)行網(wǎng)絡(luò)操作?如何在 service 中執(zhí)行網(wǎng)絡(luò)操作?(在service如何執(zhí)行耗時(shí)操作)

可以直接在 Service 中執(zhí)行網(wǎng)絡(luò)操作,在 onStartCommand()方法中可以執(zhí)行網(wǎng)絡(luò)操作

如果需要在服務(wù)中進(jìn)行耗時(shí)操作,可以選擇IntentService, IntentService是Service的子類(lèi),用來(lái)處理異步請(qǐng)求。

IntentService在onCreate()方法中通過(guò)HandlerThread單獨(dú)開(kāi)啟一個(gè)線程來(lái)處理Intent請(qǐng)求對(duì)象所對(duì)應(yīng)的任務(wù),這樣可以避免事務(wù)處理阻塞主線程。

onHandleIntent()函數(shù)針對(duì)Intent的不同進(jìn)行不同的事務(wù)處理就可以,執(zhí)行完一個(gè)Intent請(qǐng)求對(duì)象所對(duì)應(yīng)的工作之后,如果沒(méi)有新的Intent請(qǐng)求達(dá)到,則自動(dòng)停止Service; 否則ServiceHandler會(huì)取得下一個(gè)Intent請(qǐng)求
傳入該函數(shù)來(lái)處理其所對(duì)應(yīng)的任務(wù)。

2.0 如何提高service的優(yōu)先級(jí)? (理解,說(shuō)出兩三條就很nB了)

參考文章

  • 1、在AndroidManifest.xml文件中對(duì)于intent-filter可以通過(guò)android:priority = “1000”這個(gè)屬性設(shè)置最高優(yōu)先級(jí),1000是最高值,如果數(shù)字越小則優(yōu)先級(jí)越低,同時(shí)實(shí)用于廣播。

  • 2、在onStartCommand里面調(diào)用 startForeground()方法把Service提升為前臺(tái)進(jìn)程級(jí)別,然后再onDestroy里面要記得調(diào)用stopForeground ()方法。

  • 3、onStartCommand方法,手動(dòng)返回START_STICKY。

  • 4、 在onDestroy方法里發(fā)廣播重啟service。
    service +broadcast 方式,就是當(dāng)service走ondestory的時(shí)候,發(fā)送一個(gè)自定義的廣播,當(dāng)收到廣播的時(shí)候,重新啟動(dòng)service。(第三方應(yīng)用或是在setting里-應(yīng)用-強(qiáng)制停止時(shí),APP進(jìn)程就直接被干掉了,onDestroy方法都進(jìn)不來(lái),所以無(wú)法保證會(huì)執(zhí)行)

  • 5、監(jiān)聽(tīng)系統(tǒng)廣播判斷Service狀態(tài)。
    通過(guò)系統(tǒng)的一些廣播,比如:手機(jī)重啟、界面喚醒、應(yīng)用狀態(tài)改變等等監(jiān)聽(tīng)并捕獲到,然后判斷我們的Service是否還存活。

  • 6、Application加上Persistent屬性。

2.1 Service 的 onStartCommand 方法有幾種返回值?各代表什么意思?

有四種返回值,不同值代表的意思如下:

  • START_STICKY:如果 service 進(jìn)程被 kill 掉,保留 service 的狀態(tài)為開(kāi)始狀態(tài),但不保留遞送的 intent 對(duì)象。隨 后系統(tǒng)會(huì)嘗試重新創(chuàng)建 service,由于服務(wù)狀態(tài)為開(kāi)始狀態(tài),所以創(chuàng)建服務(wù)后一定會(huì)調(diào)用 onStartCommand(Intent,int,int)方法。如果在此期間沒(méi)有任何啟動(dòng)命令被傳遞到 service,那么參數(shù) Intent 將為 null。
  • START_NOT_STICKY:“非粘性的”。使用這個(gè)返回值時(shí),如果在執(zhí)行完 onStartCommand 后,服務(wù)被異常 kill 掉,系統(tǒng)不會(huì)自動(dòng)重啟該服務(wù)。
  • START_REDELIVER_INTENT:重傳 Intent。使用這個(gè)返回值時(shí),如果在執(zhí)行完 onStartCommand 后,服務(wù)被異 常 kill 掉,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將 Intent 的值傳入。
  • START_STICKY_COMPATIBILITY: START_STICKY 的兼容版本,但不保證服務(wù)被 kill 后一定能重啟。

2.2 Service 的 onRebind(Intent)方法在什么情況下會(huì)執(zhí)行?

如果在 onUnbind()方法返回 true 的情況下會(huì)執(zhí)行,否則不執(zhí)行。

2.3 Activity 調(diào)用 Service 中的方法都有哪些方式?

  • Binder:
    通過(guò) Binder 接口的形式實(shí)現(xiàn),當(dāng) Activity 綁定 Service 成功的時(shí)候 Activity 會(huì)在 ServiceConnection 的類(lèi) 的 onServiceConnected()回調(diào)方法中獲取到 Service 的 onBind()方法 return 過(guò)來(lái)的 Binder 的子類(lèi),然后通過(guò)對(duì)象調(diào)用方法。

  • Aidl:
    aidl 比較適合當(dāng)客戶端和服務(wù)端不在同一個(gè)應(yīng)用下的場(chǎng)景。

  • Messenger:
    它引用了一個(gè)Handler對(duì)象,以便others能夠向它發(fā)送消息(使用mMessenger.send(Message msg)方法)。該類(lèi)允許跨進(jìn)程間基于Message的通信(即兩個(gè)進(jìn)程間可以通過(guò)Message進(jìn)行通信),在服務(wù)端使用Handler創(chuàng)建一個(gè)Messenger,客戶端持有這個(gè)Messenger就可以與服務(wù)端通信了。一個(gè)Messeger不能同時(shí)雙向發(fā)送,兩個(gè)就就能雙向發(fā)送了

這里畫(huà)了一個(gè)粗淺的圖幫助大家理解。

image.png

1. Activity 系列問(wèn)題

1.1 請(qǐng)簡(jiǎn)要介紹Android的四大組件。(會(huì)說(shuō)即可,不用死記硬背)

  • Activity:提供一個(gè)界面讓用戶點(diǎn)擊和各種滑動(dòng)操作
  • Service :可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而沒(méi)有用戶界面的應(yīng)用組件
  • Broadcast Receiver :一種廣泛運(yùn)用在應(yīng)用程序之間傳輸信息的機(jī)制,通過(guò)發(fā)送Intent來(lái)傳送我們的數(shù)據(jù)
  • Content Provider :內(nèi)容提供者,它是用在不同的應(yīng)用程序之間共享數(shù)據(jù)時(shí),可以把一個(gè)應(yīng)用的數(shù)據(jù)提供給其他的應(yīng)用使用。

1.2 Android中Activity, Intent, Content Provider, Service各有什么區(qū)別。(說(shuō)出他們是什么即可)

  • Activity:
  • Intent: 意圖,描述應(yīng)用想干什么。最重要的部分是動(dòng)作和動(dòng)作對(duì)應(yīng)的數(shù)據(jù)。
  • Content Provider:
  • Service:

1.3 Manifest.xml文件中主要包括哪些信息?

  • 1.manifest:根節(jié)點(diǎn),描述了package中所有的內(nèi)容。
  • 2.uses-permission:請(qǐng)求你的package正常運(yùn)作所需賦予的安全許可。
  • 3.permission: 聲明了安全許可來(lái)限制哪些程序能你package中的組件和功能。
  • 4.instrumentation:聲明了用來(lái)測(cè)試此package或其他package指令組件的代碼。
  • 5.application:包含package中application級(jí)別組件聲明的根節(jié)點(diǎn)。
  • 6.activity:Activity是用來(lái)與用戶交互的主要工具。
  • 7.receiver:IntentReceiver能使的application獲得數(shù)據(jù)的改變或者發(fā)生的操作,即使它當(dāng)前不在運(yùn)行。
  • 8.service:Service是能在后臺(tái)運(yùn)行任意時(shí)間的組件。
  • 9.provider:ContentProvider是用來(lái)管理持久化數(shù)據(jù)并發(fā)布給其他應(yīng)用程序使用的組件。

1.4 繪制Activity生命周期流程圖(Activity的生命周期)

1.4 介紹下不同場(chǎng)景下Activity生命周期的變化過(guò)程

  • 啟動(dòng)Activity: onCreate()--->onStart()--->onResume(),Activity進(jìn)入運(yùn)行狀態(tài)。
  • Activity退居后臺(tái): 當(dāng)前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏: onPause()--->onStop(),進(jìn)入停滯狀態(tài)。
  • Activity返回前臺(tái): onRestart()--->onStart()--->onResume(),再次回到運(yùn)行狀態(tài)。
  • Activity退居后臺(tái),且系統(tǒng)內(nèi)存不足, 系統(tǒng)會(huì)殺死這個(gè)后臺(tái)狀態(tài)的Activity,若再次回到這個(gè)Activity,則會(huì)走onCreate()-->onStart()--->onResume()
  • 鎖定屏與解鎖屏幕 只會(huì)調(diào)用onPause(),而不會(huì)調(diào)用onStop方法,開(kāi)屏后則調(diào)用onResume()

1.5 內(nèi)存不足時(shí)系統(tǒng)會(huì)殺掉后臺(tái)的Activity,若需要進(jìn)行一些臨時(shí)狀態(tài)的保存,在哪個(gè)方法進(jìn)行?

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()、onPause()等生命周期方法,它們并不一定會(huì)被觸發(fā)。

答:onSaveInstanceState() 方法,當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足、用戶直接按Home鍵)由系統(tǒng)銷(xiāo)毀一個(gè)Activity,onSaveInstanceState() 會(huì)被調(diào)用。但是當(dāng)用戶主動(dòng)去銷(xiāo)毀一個(gè)Activity時(shí),例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會(huì)被調(diào)用。除非該activity是被用戶主動(dòng)銷(xiāo)毀的,通常onSaveInstanceState()只適合用于保存一些臨時(shí)性的狀態(tài),而onPause()適合用于數(shù)據(jù)的持久化保存。

1.6 onSaveInstanceState()被執(zhí)行的場(chǎng)景有哪些:

系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會(huì)被銷(xiāo)毀,因此系統(tǒng)都會(huì)調(diào)用onSaveInstanceState(),讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則

    1. 當(dāng)用戶按下HOME鍵時(shí)
    1. 長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)
    1. 鎖屏?xí)r
    1. 從activity A中啟動(dòng)一個(gè)新的activity時(shí)
    1. 屏幕方向切換時(shí)

1.7 兩個(gè) Activity 之間跳轉(zhuǎn)時(shí)必然會(huì)執(zhí)行的是哪幾個(gè)方法?

一般情況下比如說(shuō)有兩個(gè) activity,分別叫 A,B,當(dāng)在 A 里面激活 B 組件的時(shí)候, A 會(huì)調(diào)用 onPause()方法,然后 B 調(diào)用 onCreate() ,onStart(), onResume()。

這個(gè)時(shí)候 B 覆蓋了窗體, A 會(huì)調(diào)用 onStop()方法. 如果 B 是個(gè)透明的,或者 是對(duì)話框的樣式, 就不會(huì)調(diào)用 A 的 onStop()方法。

1.8 如何將一個(gè) Activity 設(shè)置成窗口的樣式?

只需要給我們的 Activity 配置如下屬性即可。
android:theme="@android:style/Theme.Dialog"

1.9如何退出 Activity?如何安全退出已調(diào)用多個(gè) Activity 的 Application?(知道即可)

  • 1.通常情況用戶退出一個(gè) Activity 只需按返回鍵,我們寫(xiě)代碼想退出 activity 直接調(diào)用 finish()方法就行。
  • 2.發(fā)送特定廣播:

在需要結(jié)束應(yīng)用時(shí),發(fā)送一個(gè)特定的廣播,每個(gè) Activity 收到廣播后,關(guān)閉 即可。

//給某個(gè) activity 注冊(cè)接受接受廣播的意圖 registerReceiver(receiver, filter)

//如果過(guò)接受到的是 關(guān)閉 activity 的廣播 activity finish()掉

  • 3.遞歸退出
    就調(diào)用 finish()方法 把當(dāng)前的
    在打開(kāi)新的 Activity 時(shí)使用 startActivityForResult,然后自己加標(biāo)志,在 onActivityResult 中處理,遞歸關(guān)閉。
  • 4.其實(shí) 也可以通過(guò) intent 的 flag 來(lái)實(shí)現(xiàn) intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個(gè)新的 activity。 此時(shí)如果該任務(wù)棧中已經(jīng)有該 Activity,那么系統(tǒng)會(huì)把這個(gè) Activity 上面的所有 Activity 干掉。其實(shí)相當(dāng)于給 Activity 配置的啟動(dòng)模式為 SingleTop。
  • 5.記錄打開(kāi)的 Activity:
    每打開(kāi)一個(gè) Activity,就記錄下來(lái)。在需要退出時(shí),關(guān)閉每一個(gè) Activity
//偽代碼
List<Activity> lists ;// 在 application 全局的變量里面 lists = new ArrayList<Activity>();
lists.add(this);
for(Activity activity: lists)
{
       activity.finish();
    }
lists.remove(this); 

2.0 Android 中的 Context, Activity,Appliction 有什么區(qū)別?

  • 相同:Activity 和 Application 都是 Context 的子類(lèi)。
    Context 從字面上理解就是上下文的意思,在實(shí)際應(yīng)用中它也確實(shí)是起到了管理 上下文環(huán)境中各個(gè)參數(shù)和變量的總用,方便我們可以簡(jiǎn)單的訪問(wèn)到各種資源。
  • 不同:維護(hù)的生命周期不同。Context 維護(hù)的是當(dāng)前的 Activity 的生命周期, Application 維護(hù)的是整個(gè)項(xiàng)目的生命周期。使用 context 的時(shí)候,小心內(nèi)存泄露,防止內(nèi)存泄露,注意一下幾個(gè)方面:

2.1 Context 是什么?(理解)

1、它描述的是一個(gè)應(yīng)用程序環(huán)境的信息,即上下文。

2、該類(lèi)是一個(gè)抽象(abstract class)類(lèi),Android 提供了該抽象類(lèi)的具體實(shí) 現(xiàn)類(lèi)(ContextIml)。

3、通過(guò)它我們可以獲取應(yīng)用程序的資源和類(lèi),也包括一些應(yīng)用級(jí)別操作, 例如:啟動(dòng)一個(gè) Activity,發(fā)送廣播,接受 Intent,信息,等。

附加一張Context繼承關(guān)系圖

這里寫(xiě)圖片描述

2.2如何獲取當(dāng)前屏幕Activity的對(duì)象?

使用ActivityLifecycleCallbacks

傳送地址:

Android 如何獲取當(dāng)前Activity實(shí)例對(duì)象?

2.3你知道onNewIntent嗎?

如果IntentActivity處于任務(wù)棧的頂端,也就是說(shuō)之前打開(kāi)過(guò)的Activity,現(xiàn)在處于onPause、onStop 狀態(tài)的話,其他應(yīng)用再發(fā)送Intent的話,執(zhí)行順序?yàn)椋?br> onNewIntent,onRestart,onStart,onResume。

2.4 除了用Intent 去啟動(dòng)一個(gè)Activity,還有其他方法嗎?

使用adb shell am 命令

am啟動(dòng)一個(gè)activity
adb shell am start com.example.fuchenxuan/.MainActivity
am發(fā)送一個(gè)廣播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER

2.5 Android Service與Activity之間通信的幾種方式?

  • 通過(guò)Binder對(duì)象
    當(dāng)Activity通過(guò)調(diào)用bindService(Intent service, ServiceConnection conn,int flags),得到一個(gè)Service的一個(gè)對(duì)象,通過(guò)這個(gè)對(duì)象我們可以直接訪問(wèn)Service中的方法。
  • 通過(guò)Broadcast Receiver(廣播)的形式
  • EventBus

2.6 如果新Activity是透明主題時(shí),舊Activity會(huì)不會(huì)走onStop

不會(huì)!

2.7 介紹Activity的幾中啟動(dòng)模式,并簡(jiǎn)單說(shuō)說(shuō)自己的理解或者使用場(chǎng)景

  • standard
    默認(rèn)模式,可以不用寫(xiě)配置。在這個(gè)模式下,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例。因此,在這種模式下,可以有多個(gè)相同的實(shí)例,也允許多個(gè)相同Activity疊加。

  • singleTop
    可以有多個(gè)實(shí)例,但是不允許多個(gè)相同Activity疊加。即,如果Activity在棧頂?shù)臅r(shí)候,啟動(dòng)相同的Activity,不會(huì)創(chuàng)建新的實(shí)例,而會(huì)調(diào)用其onNewIntent方法。

  • singleTask
    只有一個(gè)實(shí)例。在同一個(gè)應(yīng)用程序中啟動(dòng)他的時(shí)候,若Activity不存在,則會(huì)在當(dāng)前task創(chuàng)建一個(gè)新的實(shí)例,若存在,則會(huì)把task中在其之上的其它Activity destory掉并調(diào)用它的onNewIntent方法。
    如果是在別的應(yīng)用程序中啟動(dòng)它,則會(huì)新建一個(gè)task,并在該task中啟動(dòng)這個(gè)Activity,singleTask允許別的Activity與其在一個(gè)task中共存,也就是說(shuō),如果我在這個(gè)singleTask的實(shí)例中再打開(kāi)新的Activity,這個(gè)新的Activity還是會(huì)在singleTask的實(shí)例的task中。

  • singleInstance
    只有一個(gè)實(shí)例,并且這個(gè)實(shí)例獨(dú)立運(yùn)行在一個(gè)task中,這個(gè)task只有這個(gè)實(shí)例,不允許有別的Activity存在。

2.8 什么是ANR,如何避免他

image.png

2.9 Activity的管理機(jī)制

經(jīng)驗(yàn)總結(jié)
面試官問(wèn)這個(gè)問(wèn)題,想看看大家對(duì)Activity了解是否深入,什么是ActivityRecord,什么是TaskRecord,什么是ActivityManagerService,如果這些大家都能說(shuō)出來(lái),起碼是一個(gè)好多年工作經(jīng)驗(yàn)的老司機(jī)了,一般很多對(duì)Activity的了解還是停留在界面上

Activity的管理機(jī)制

簡(jiǎn)述通過(guò)ContentResolver獲取ContentProvider內(nèi)容的基本步驟

基本步驟:

得到ContentResolver類(lèi)對(duì)象:ContentResolver cr = getContentResolver()。
定義要查詢的字段String數(shù)組。
使用cr.query();返回一個(gè)Cursor對(duì)象。
使用while循環(huán)得到Cursor里面的內(nèi)容。

Android中如何訪問(wèn)自定義ContentProvider?

通過(guò)ContentProvider的Uri訪問(wèn)開(kāi)放的數(shù)據(jù)。

  • 1.ContenResolver對(duì)象通過(guò)Context提供的方法getContenResolver()來(lái)獲得。
  • 2.ContenResolver提供了以下方法來(lái)操作:insert delete update query這些方法分別會(huì)調(diào)用ContenProvider中與之對(duì)應(yīng)的方法并得到返回的結(jié)果。

SurfaceView和View的區(qū)別是什么?

SurfaceView中采用了雙緩存技術(shù),在單獨(dú)的線程中更新界面;View在UI線程中更新界面

你在項(xiàng)目中哪些地方用到了XML?

XML的主要作用有兩個(gè)方面:數(shù)據(jù)交換和信息配置。在做數(shù)據(jù)交換時(shí),XML將數(shù)據(jù)用標(biāo)簽組裝成起來(lái),然后壓縮打包加密后通過(guò)網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再?gòu)腦ML文件中還原相關(guān)信息進(jìn)行處理,XML曾經(jīng)是異構(gòu)系統(tǒng)間交換數(shù)據(jù)的事實(shí)標(biāo)準(zhǔn),但此項(xiàng)功能幾乎已經(jīng)被JSON(JavaScript Object Notation)取而代之。當(dāng)然,目前很多軟件仍然使用XML來(lái)存儲(chǔ)配置信息,我們?cè)诤芏囗?xiàng)目中通常也會(huì)將作為配置信息的硬代碼寫(xiě)在XML文件中,Java的很多框架也是這么做的,而且這些框架都選擇了dom4j作為處理XML的工具,因?yàn)镾un公司的官方JavaSE實(shí)在不怎么好用。Android里的布局文件和配置文件都用的XML。

Android中定義style和theme的區(qū)別

經(jīng)驗(yàn)總結(jié):

一般面試官問(wèn)這樣

不同點(diǎn):

  • Theme是應(yīng)用于Activity或者是整個(gè)Application的,作用于單個(gè)Activity或者所有Acity,不能作用于某個(gè)控件的

  • Style是應(yīng)用于某個(gè)(些)控件,Layout的,作用于控件級(jí)別的。

兩者總結(jié)一句就是:相對(duì)而言Theme是作用于全局的,而Style是作用于局部的。定義方式一樣,使用的地方不一樣。

相同點(diǎn):

都位于values文件夾下的style.xml中,定義的方法一樣,都是控制UI的一堆屬性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容