Android知識解答
注:以下AC代表Activity挑宠,F(xiàn)G代表Fragment
1. Activity相關(guān)
1.1 AC的啟動模式
standard:標準模式,默認是標準模式颓影。每一次啟動都會創(chuàng)建一個新的實例各淀,符合典型的AC生命周期。用ApplicationContext去啟動AC會報錯诡挂,因為沒有任務(wù)棧存放碎浇。
singleTop:棧頂復(fù)用模式。如果AC位于任務(wù)棧的棧頂璃俗,那么此AC不會被重新創(chuàng)建奴璃,同時它的onNewIntent方法會被調(diào)用,通過此方法的參數(shù)我們可以取出當前請求的信息旧找。onCreate和onStart不會被調(diào)用溺健。(啟動消息通知界面,循環(huán)搜索界面)
singleTask:棧內(nèi)復(fù)用模式。沒有需要的任務(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并負責(zé)棧內(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ù)并恢復(fù),onRestoreInstanceState在onStart之后被調(diào)用柱蟀。橫豎屏切換的時候川蒙。可以在Manifest設(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ā)生改變靖榕,就會導(dǎo)致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