分別寫了兩個AIDL? APP披诗,一個作為服務(wù)端,一個是客戶端
服務(wù)端沒啥說的奇适,在客戶端中
我們連接AIDL是使用BindService的羽嫡,在很久以前我在BindService的時候就在問ServiceConnection接口中的onServiceConnected會在bindService的時候被回調(diào)
但是onServiceDisconnected方法什么時候調(diào)用呢?我之前做過測試和查閱過資料舞肆,這個方法正常情況該方法不會被調(diào)用焦辅,只有在程序被意外關(guān)閉或者進(jìn)程被殺才自動調(diào)用
就是說,當(dāng)服務(wù)異常意外斷開的時候椿胯,這個方法才會被調(diào)用筷登,手動unBindService是不會走這個方法的,事實也是如此
那如果在不使用LinkToDeath的時候哩盲,想AIDL崩潰再重啟前方,在這個方法里處理是可以的【已測試可行】
這樣可以重啟Aidl
LinkToDeath的方法是在binder對象不正常消失的時候,會調(diào)用廉油,比如說意外斷開惠险,其效果和onServiceConnected一樣,只是調(diào)用的先后順序不同
unLinkToDeath可以清除之前設(shè)置的監(jiān)聽器
下圖的1是啟動時抒线,第一次綁定服務(wù)班巩,2代表服務(wù)意外斷開并重啟服務(wù)
從代碼測試來看,這兩種方法都可以重新BindService嘶炭,經(jīng)過多次測試抱慌,每次Aidl意外斷開都會調(diào)起linkToDeath和onServiceDisconnected方法逊桦,只是linkToDeath方法調(diào)用在onServiceDisconnected之前,其他沒發(fā)現(xiàn)區(qū)別
另外在查看資料時抑进,有說到在RemoteException中處理卫袒,但是RemoteException都是我們try{}catch{}的,所以使用UncaughtExceptionHandler是無法捕捉到RemoteException的单匣,否則也是可以進(jìn)行處理的
附上源碼注釋:
從注釋中可以看到這兩個的區(qū)別:linkToDeath是在綁定的對象意外消失的時候回調(diào)夕凝,一般是進(jìn)程被殺,onServiceDisconnected是當(dāng)服務(wù)連接丟失時回調(diào)户秤,而且還說明通常是進(jìn)程崩潰或者被殺码秉,所以通常時候,可認(rèn)為這兩個方法效果一致