Android多進程之Binder的意外死亡及權限校驗

Android多進程系列

經過前幾篇文章,咱們對Binder的使用和工做流程有了必定的瞭解,可是還有幾個問題休要咱們去解決。一個是若是服務端進程意外退出,Binder死亡,那客戶端就會請求失敗;還有一個就是權限校驗問題,就是服務端須要校驗一下客戶端的身份權限,不能誰都能請求服務端的服務ide

Binder意外死亡的處理

給Binder設置DeathRecipient監聽測試

  • 在綁定Service服務後的onServiceConnected回調中給Binder註冊死亡回調DeathRecipient
private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        Log.e(TAG, "ServiceConnection-->"+ System.currentTimeMillis());
        IBookManager bookManager = BookManagerImpl.asInterface(iBinder);
        mRemoteBookManager = bookManager;
        try {
            //註冊死亡回調
            iBinder.linkToDeath(mDeathRecipient,0);
            ...

        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.e(TAG, "onServiceDisconnected-->binder died");
    }
};
  • 在DeathRecipient中相應的處理,好比從新鏈接服務端
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
    @Override
    public void binderDied() {
        Log.e(TAG, "mDeathRecipient-->binderDied-->");
        if (mRemoteBookManager == null) {
            return;
        }
        mRemoteBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);
        mRemoteBookManager = null;
        //Binder死亡,從新綁定服務
        Log.e(TAG, "mDeathRecipient-->bindService");
        Intent intent = new Intent(MainActivity.this, BookManagerService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }
};
  • 爲了測試,咱們在服務端添加結束進程的代碼
相關文章
相關標籤/搜索