AIDL通訊過程中設定死亡代理
阿新 • • 發佈:2018-11-11
關於AIDL的使用參考學習:
https://blog.csdn.net/u011240877/article/details/72765136
https://blog.csdn.net/iromkoear/article/details/59706441
關於設定死亡代理:
在進行程序間通訊的過程中,如果服務端程序由於某種原因異常終止,我們的遠端呼叫就會失敗,影響我們的功能,那麼怎麼樣能夠知道服務端程序是否終止了呢,一種方法就是給Binder設定死亡代理。
方法是在onServiceConnected()函式中,
mBookManager.asBinder().linkToDeath(mDeathRecipient,0);//mBookManager為服務端進行的Service物件,通過asBinder()可以獲得Binder物件
另外定義死亡代理物件
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { if (mBookManager == null) return; mBookManager.asBinder().unlinkToDeath(mDeathRecipient,0);//解除死亡通知,如果Binder死亡了,不會在觸發binderDied方法 mBookManager = null; } };
如果服務端程序死亡了,會回撥到binderDied()函式
後面通過判斷mBookManager是否為null即可知道服務端程序是否死亡
除設定死亡代理,Binder物件還有兩個方法可以判斷伺服器進行是否存在或存活,返回均為boolean型別
mBookManager.asBinder().pingBinder();
mBookManager.asBinder().isBinderAlive();
/**//檢查Binder物件是否存在 * Check to see if the object still exists. * * @return Returns false if the * hosting process is gone, otherwise the result (always by default * true) returned by the pingBinder() implementation on the other * side. */ public boolean pingBinder(); /**//檢查Binder所在的程序是否存活 * Check to see if the process that the binder is in is still alive. * * @return false if the process is not alive. Note that if it returns * true, the process may have died while the call is returning. */ public boolean isBinderAlive();
參考https://blog.csdn.net/small_lee/article/details/79181985