Android APP存活檢測方式
稍微深入了解過Android的開發(fā)者都知道,Android中每個(gè)APP的中的所有組件的生命周期狀態(tài)都是由ActivityManagerService(簡稱:AMS)進(jìn)程來維護(hù)的,所以當(dāng)某個(gè)APP被kill或意外crash時(shí),AMS進(jìn)程會(huì)第一時(shí)間維護(hù)APP的組件。
我們今天不會(huì)看AMS進(jìn)程維護(hù)APP的流程,只看AMS是通過什么手段第一時(shí)間得到的通知,我們是否能夠?qū)⑦@種手段應(yīng)用到我們的APP中,在多進(jìn)程環(huán)境下,通過這種手段進(jìn)程間互相監(jiān)控起到一個(gè)守護(hù)的作用。
我們知道一個(gè)APP對應(yīng)唯一一個(gè)ActivityThread,這也是一個(gè)APP的真正的入口,當(dāng)ActivityThread#main執(zhí)行時(shí),就會(huì)附著到AMS進(jìn)程,后續(xù)就由AMS進(jìn)程維護(hù)APP的狀態(tài)。那么關(guān)鍵點(diǎn)就在attach上。
見以下代碼:ActivityManagerService#attachApplicationLocked()
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid) {
...
final String processName = app.processName;
try {
AppDeathRecipient adr = new AppDeathRecipient(
app, pid, thread);
<span style="background-color: rgb(255, 255, 51);"><strong>thread.asBinder().linkToDeath(adr, 0);</strong></span>
app.deathRecipient = adr;
} catch (RemoteException e) {
app.resetPackageList(mProcessStats);
startProcessLocked(app, "link fail", processName);
return false;
}
...
return true;
}
上面被高亮顯示的這行代碼,就是關(guān)鍵點(diǎn)。 使用的是IBinder#linkToDeath來完成的。linkToDeath方法的第一個(gè)參數(shù)接收一個(gè)android.os.IBinder.DeathRecipient的接口實(shí)現(xiàn),用來接收app death的通知。
當(dāng)然也可以通過IBinder#unlinkToDeath來取消監(jiān)聽。
感興趣的同學(xué),可以進(jìn)入源碼查看詳細(xì)的注釋,這里就不在貼注釋。 源碼中DeathRecipient的實(shí)現(xiàn)是AppDeathRecipient來完成的, 這個(gè)處理中主要是AMS來清理當(dāng)前APP進(jìn)程對應(yīng)的組件資源。
通過上面的了解,在我們的APP中要使用以上手段,多個(gè)進(jìn)程之間要起到守護(hù)對方的作用,可能就需要得到對方的IBinder對象。
獲取IBinder對象的方法,參考如下:
1.通過Context#bindService,在onServiceConnected上接收IBinder對象;
2.通過創(chuàng)建android.os.Messenger對象,然后通過intent將此對象傳遞給對方進(jìn)程;
3.直接new Binder重寫onTransact,然后通過intent將此Binder對象傳遞給對方進(jìn)程;
以上這篇Android APP存活檢測方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android高版本API方法如何在低版本系統(tǒng)上做兼容性處理淺析
這篇文章主要給大家介紹了關(guān)于Android高版本API方法如何在低版本系統(tǒng)上做兼容性處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Android傳遞參數(shù)給webView的h5頁面3種方法
最近幾年隨著h5的強(qiáng)勢崛起,越來越多的公司運(yùn)用h5開發(fā)或者采用h5與android的混合開發(fā),這篇文章主要給大家介紹了關(guān)于Android傳遞參數(shù)給webView的h5頁面的3種方法,需要的朋友可以參考下2024-08-08
Android實(shí)現(xiàn)簡單音樂播放器(MediaPlayer)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡單音樂播放器MediaPlayer的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
android 為應(yīng)用程序創(chuàng)建桌面快捷方式技巧分享
手機(jī)裝的軟件過多,找起來很不方便,所以在主頁面有一個(gè)快捷方式的話會(huì)很不錯(cuò)的,本文將介紹如何實(shí)現(xiàn),需要了解跟多的朋友可以參考下2012-12-12
Android基于ListView實(shí)現(xiàn)類似QQ空間的滾動(dòng)翻頁與滾動(dòng)加載效果
這篇文章主要介紹了Android基于ListView實(shí)現(xiàn)類似QQ空間的滾動(dòng)翻頁與滾動(dòng)加載效果,涉及ListView相關(guān)屬性與方法的操作技巧,需要的朋友可以參考下2016-08-08
總結(jié)Android中多線程更新應(yīng)用的頁面信息的方式
這篇文章主要介紹了總結(jié)Android中多線程更新應(yīng)用的頁面信息的方式,文中共總結(jié)了runOnUiThread、Handler、AsyncTask異步以及View直接在UI線程中更新的方法,需要的朋友可以參考下2016-02-02
Android實(shí)現(xiàn)觸發(fā)html頁面的Button控件點(diǎn)擊事件方式
這篇文章主要介紹了Android實(shí)現(xiàn)觸發(fā)html頁面的Button控件點(diǎn)擊事件方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android自定義TimeButton實(shí)現(xiàn)倒計(jì)時(shí)按鈕
這篇文章主要為大家詳細(xì)介紹了Android自定義TimeButton實(shí)現(xiàn)倒計(jì)時(shí)按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12

