Android知識解答
注:以下AC代表Activity,F(xiàn)G代表Fragment
1. Activity相關(guān)
1.1 AC的啟動模式
standard:標準模式,默認是標準模式。每一次啟動都會創(chuàng)建一個新的實例,符合典型的AC生命周期。用ApplicationContext去啟動AC會報錯,因為沒有任務(wù)棧存放。
singleTop:棧頂復用模式。如果AC位于任務(wù)棧的棧頂,那么此AC不會被重新創(chuàng)建,同時它的onNewIntent方法會被調(diào)用,通過此方法的參數(shù)我們可以取出當前請求的信息。onCreate和onStart不會被調(diào)用。(啟動消息通知界面,循環(huán)搜索界面)
singleTask:棧內(nèi)復用模式。沒有需要的任務(wù)棧,創(chuàng)建新的任務(wù)棧,放入AC;有任務(wù)棧沒有當前AC實例,創(chuàng)建實例放入棧中;有任務(wù)棧有實例,調(diào)用AC到棧頂,并調(diào)用onNewIntent發(fā)法,清空當前AC上面的AC。(大部分app的首頁,瀏覽器)
singleInstance:單實例模式。加強的singleTask,只會單獨存在于一個特殊的任務(wù)棧中,后續(xù)請求不會再重新創(chuàng)建,除非這個單獨的任務(wù)棧被系統(tǒng)銷毀了。(打電話界面,鬧鐘提醒)
1.2. AC的生命周期,a的onStop和b的onResume誰先執(zhí)行,AC的啟動過程
onCreate:AC正在被創(chuàng)建,做一些初始化的操作
onStart:可見不可交互
onResume:前臺可交互
onPause:緊接會調(diào)用onStop,不要做太耗時的操作
onStop:停止,稍微重量級的回收操作
onDestroy:做回收工作,和資源釋放
a啟動b,a的onPause先執(zhí)行,然后b的onCreate,onStart,onResume,再到a的onStop。
AC的啟動過程:啟動AC的請求會有Instrumentation來處理,然后它通過Binder向AMS(ActivityManagerService)發(fā)請求,AMS內(nèi)部維護這一個ActivityStack并負責棧內(nèi)的Activity的狀態(tài)同步,AMS通過ActivityThread去同步Activity的狀態(tài)從而完成生命周期的方法調(diào)用
1.3 AC了解嗎?onSaveInstanceState和onRestoreInstanceState何時會調(diào)用
Activity是四大組件之一,它提供一個界面讓用戶點擊和各種滑動操作。
當AC不做特殊處理,系統(tǒng)配置發(fā)生改變,AC就會被銷毀和重新創(chuàng)建。異常情況下,系統(tǒng)會調(diào)用onSaveInstanceState保存當前AC的狀態(tài),可能在onPause之前,也可能在之后。只會在AC異常的情況下調(diào)用,正常情況下不會調(diào)用。當AC被重新創(chuàng)建的時候,系統(tǒng)會調(diào)用onRestoreInstanceState,并且把onSaveInstanceState保存的Bundle對象作為參數(shù)傳給onRestoreInstanceState和onCreate對象。所以可以通過onRestoreInstanceState和onCreate方法來判斷Activity是否被重建,重建了,就可以拿出之前的數(shù)據(jù)并恢復,onRestoreInstanceState在onStart之后被調(diào)用。橫豎屏切換的時候??梢栽贛anifest設(shè)置onConfigChanges。
2. Service相關(guān)
2.1 Service的生命周期
2.2 Service的啟動方式
3. Broadcast相關(guān)
3.1 Broadcast的注冊方式與區(qū)別
4.MVC,MVP,MVVM架構(gòu)的區(qū)別
序列化了解嗎?兩種方法有什么區(qū)別?Android提供的一般用在哪?如何保證對象是你要反序列化的哪一個?
序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。在序列化期間,對象將其當前狀態(tài)寫入到臨時或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。
序列化有Java提供的接口Serializable和Android提供的Parcelable。
Serializable:Java提供的, 是一個空接口,為對象提供標準的序列化和反序列化操作。在需要實現(xiàn)序列化的類聲明一個標識serialVersionUID,為了保證序列化前后對象是同一個。當不主動指定UID的時候,成員變量的數(shù)量和類型發(fā)生改變,就會導致UID不一樣,如果UID不一樣,就會報InvalidClassException。靜態(tài)成員變量因為屬于類不屬于對象,不會參與序列化的過程;還有用transient關(guān)鍵字標識的成員變量也不參與序列化的過程。
使用場景:雖然Serializable使用起來簡單,但是開銷大,序列化和反序列化的過程中需要進行大量的I/O操作。一般在保存數(shù)據(jù)到存儲設(shè)備上或者通過網(wǎng)絡(luò)傳輸?shù)臅r候使用
Parcelable: Android提供的,也是一個接口。實現(xiàn)Parcelable,需要實現(xiàn)4個方法。
使用場景:因為是Android提供的,所以在Android平臺上推薦使用Parcelable,雖然使用起來麻煩一點,但是效率很高,因為Android底層做過優(yōu)化,比如Intent,bundle傳值之類的。
Intent傳遞的時候可以攜帶哪些對象?Bitmap可以嗎?為什么要規(guī)定大???
可以傳遞基本數(shù)據(jù)類型或者基本數(shù)據(jù)類型的集合、String或CharSequence、實現(xiàn)序列化的對象。因為Bitmap實現(xiàn)了Parcelable接口,所以intent是可以攜帶的,但是有大小的限制,大概是1m左右。
為什么要規(guī)定大?。總€人認為,intent傳輸其實本質(zhì)binder機制,binder限制了大數(shù)據(jù)的傳輸。原因可能是太耗時,容易造成卡頓。
handler機制,為何主線程不會被阻塞?handler會造成內(nèi)存泄漏嗎?會不會有喚醒機制?你怎么知道消息被放的隊列就是主線程的隊列?怎么保證的?looper標記的handler的線程信息,誰要保證的looper的線程信息?threadLocal,threadLcoal怎么保證的? postdely原理,如何保證時間執(zhí)行的?
會造成內(nèi)存泄漏,因為該線程持有Handler的引用,Handler也持有Activity的引用,GC回收不了。
解決辦法:使用static修飾handler;弱引用AC;onDestroy中移除message