1.判斷Activity是否存活的方法
案例:當(dāng)在一個(gè)activity里面用 handler做異步操作,回調(diào)的地方彈出一個(gè)dialog膜眠。假如activity已經(jīng)被銷毀籽孙,可是異步操作還在后臺(tái)進(jìn)行,進(jìn)行完dialog還是會(huì)彈出伐蒋,這時(shí)程序就crash了工三。
所以應(yīng)該在彈出dialog之前進(jìn)行判斷迁酸,判斷activity是否存活
Activity activity = mDialog.getOwnerActivity;
if(activity!=null && !activity.isFinishing && !activity.isDestroy){
//showDialog(彈出Dialog)
}
2.自定義View的狀態(tài)是如何保存的?
如果在activity異常銷毀前俭正,系統(tǒng)會(huì)調(diào)用onSaveInstanceState方法奸鬓;但是當(dāng)用戶使用返回推出activity時(shí),系統(tǒng)并不會(huì)調(diào)用掸读。重新打開(kāi)該activity串远,如果正常調(diào)用,activity類的onSaveInstanceState默認(rèn)實(shí)現(xiàn)會(huì)恢復(fù)Activity的狀態(tài)儿惫,默認(rèn)實(shí)現(xiàn)會(huì)為布局中的每個(gè)View調(diào)用相應(yīng)的 onSaveInstanceState方法澡罚,讓每個(gè)View都能保存自身的信息。這里需要注意一個(gè)細(xì)節(jié):想要保存View的狀態(tài)肾请,需要在XML布局文件中提供一個(gè)唯一的ID(android: id)留搔,View的初始化時(shí)要調(diào)用setSaveEnabled(true)。
3.說(shuō)說(shuō)Handler的機(jī)制铛铁?Handler導(dǎo)致內(nèi)存泄露的原因隔显?處理方式的是什么?
Message:消息分為硬件產(chǎn)生的消息(如按鈕饵逐、觸摸)和軟件生成的消息括眠;
MessageQueue:消息隊(duì)列的主要功能向消息池投遞消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);
Handler:消息輔助類梳毙,主要功能向消息池發(fā)送各種消息事件(Handler.sendMessage)和處理相應(yīng)消息事件(Handler.handleMessage)哺窄;
Looper:不斷循環(huán)執(zhí)行(Looper.loop),按分發(fā)機(jī)制將消息分發(fā)給目標(biāo)處理者
內(nèi)存泄露的原因:因?yàn)镠andler在activity中使用了非靜態(tài)的內(nèi)部類導(dǎo)致账锹,如果activity已經(jīng)finish了萌业,可是非靜態(tài)內(nèi)部類仍持有activity的應(yīng)用,這就導(dǎo)致了activity的內(nèi)存不能得以釋放奸柬,最終造成了內(nèi)存泄露生年。
處理方式:將handler放入單獨(dú)的類文件中或者使用靜態(tài)內(nèi)部類。當(dāng)你需要在靜態(tài)內(nèi)部類中調(diào)用外部的Activity時(shí)廓奕,我們可以使用弱引用來(lái)處理抱婉。另外關(guān)于同樣也需要將Runnable設(shè)置為靜態(tài)的成員屬性。
4.兩個(gè)Activity之間如何傳值桌粉?
(1)如果只是基本數(shù)據(jù)類型或者引用數(shù)據(jù)類型蒸绩,則可以通過(guò)Intent的bundle攜帶參數(shù),通過(guò)Intent.putExtra來(lái)傳值就可以了铃肯。
(2)如果是自定義的數(shù)據(jù)類型患亿,可以讓該對(duì)象實(shí)現(xiàn)可序列化。
實(shí)現(xiàn)可序列化的方法有兩種押逼,有什么區(qū)別呢步藕?
可以實(shí)現(xiàn)Parcelable和Serializable接口惦界,區(qū)別在于,Serializalbe會(huì)使用反射咙冗,序列化和反序列化過(guò)程需要大量I/O操作沾歪,Parcelable自已實(shí)現(xiàn)封送和解封(marshalled &unmarshalled)操作不需要用反射,數(shù)據(jù)也存放在Native內(nèi)存中雾消,效率要快很多灾搏。
那么,Parcelable和Parcel這兩者之間的關(guān)系仪或?
Parcelable 接口定義在封送/解封送過(guò)程中混合和分解對(duì)象的契約确镊。Parcelable接口的底層是Parcel容器對(duì)象。Parcel類是一種最快的序列化/反序列化機(jī)制范删,專為Android中的進(jìn)程間通信而設(shè)計(jì)譬巫。
5.Android中的Context的作用以及相關(guān)的問(wèn)題
Context提供了一個(gè)應(yīng)用的運(yùn)行環(huán)境宙橱,通過(guò)這個(gè)上下文應(yīng)用才可以訪問(wèn)資源黔攒,才能完成和其他組件球散、服務(wù)的交互。
Application(或者Service)和Activity都可以調(diào)用Context的startActivity方法添忘,那么在這兩個(gè)地方調(diào)用startActivity有區(qū)別嗎采呐?
在Application(或者Service)需要給Intent設(shè)置Intent.FLAG_ACTIVITY_NEW_TASK才能正常啟動(dòng)Activity。