1. 程式人生 > >AIDL通訊過程中設定死亡代理

AIDL通訊過程中設定死亡代理

關於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