魅族手机aidl服务绑定失败问题
这类问题网上的博文都有,第一篇中说的startService(intent)
解决问题的关键,奇葩的魅族手机。
要点(我的理解)
- 针对其他手机,在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); }
- 针对魅族手机,隐式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)方式之一
应用场景:
- 微博、微信 oauth2.0 第三方验证登录;
- 移动支付,WXPay、AliPay;
- 进程(不同App)间的数据通讯、交互,用户信息共享(安全问题)、token共享、密钥共享;
- 系统下载任务器;
前提条件: AIDL绑定的Service组件必须启动,并长时间保活在内存中
ps: 回顾 进程等级(5个)
foreground process(前台进程)
visible process(可视进程)
service process(服务进程)
background process(后台进程)
empty process(空进程)
后续再更 binder连接池、aidl语法需要注意的地方以及binder的DeathRecipient、远程断开API