Binder 基础使用细则

魅族手机aidl服务绑定失败问题

ref:
解决办法1
解决办法2
解决办法3

这类问题网上的博文都有,第一篇中说的startService(intent)解决问题的关键,奇葩的魅族手机。

要点(我的理解)

  1. 针对其他手机,在Android 5.0以后的使用隐式Intent进行bindService前,需要调用intent.setPackage("要启动的service的应用包名),绑定服务的代码参考如下:
    private void bindService() {
        Intent intent = new Intent();
        intent.setAction("com.github.zbiext.aidlservicedemo.AIDLService"); // AIDL服务类注册的action值
        intent.setPackage("com.github.zbiext.aidlservicedemo"); // Android 5.0以后 
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    }
    
  2. 针对魅族手机,隐式Intent可能存在风险,针对Intent传值,厂商一般可能修改底层代码,如上面代码在魅族手机是不生效的,导致绑定失败,需要使用ComponentName对象,而且在bindService调用之前,调用startService(intent),具体代码如下:
    private void bindService() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.github.zbiext.aidlservicedemo", "com.github.zbiext.aidlservicedemo.AIDLService")); // 包名 AIDL服务类名
        startService(intent);
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    }
    

Binder机制 —— Android系统跨进程间通信(IPC)方式之一

应用场景:

  1. 微博、微信 oauth2.0 第三方验证登录;
  2. 移动支付,WXPay、AliPay;
  3. 进程(不同App)间的数据通讯、交互,用户信息共享(安全问题)、token共享、密钥共享;
  4. 系统下载任务器;

前提条件: AIDL绑定的Service组件必须启动,并长时间保活在内存中
ps: 回顾 进程等级(5个)
foreground process(前台进程)
visible process(可视进程)
service process(服务进程)
background process(后台进程)
empty process(空进程)

后续再更 binder连接池、aidl语法需要注意的地方以及binder的DeathRecipient、远程断开API

你可能感兴趣的:(Binder 基础使用细则)