摘要(本文所讲重点):
1、 应用B未开启应用A如何绑定应用B的Service
2、 魅族手机无法bindService(非设置component解决)
最近在搞进程通信相关的东西,采用的Android提供的Messenger来实现跨进程通信,Messenger底层实现完全类似AIDL,不一样的地方在于AIDL支持多线程,且同步返回,但是我的项目并不需要这些,所以采用使用难度更低的Messenger。
期间遇到的第一个问题是,应用B处于未打开状态,应用A无法启动应用B的Service,据说早期Android是可以的,具体多早呢,不用考虑了,现在7.0,8.0,9.0肯定不支持,也不纠结,因为从安全角度来看的确不能允许这么做,不然大量不死的进程不得耗光手机电池电量才怪,具体怎么解决,很简单,从产品角度,如果应用B处于未开启状态,使用深度连接唤醒页面。
遇到最坑的问题是魅族等部分手机无法绑定Service,简直日了狗啊,从网上google,百度下来都让修改Intent的跳转方式,改为component显示启动的,添加action的,一群人或者一群网站抄来抄去瞎扯淡,也许曾经能解决问题吧,不过现在不行了。
我的解决办法是这样,看码:
private boolean bindService() {
try {
Intent intent = new Intent();
intent.setComponent(new ComponentName(ConfigCons.MYKEY_PACKAGE_NAME, ConfigCons.CONNECT_CLASS_PATH));
context.startService(intent);
boolean bindResult = context.bindService(intent, connection, Context.BIND_AUTO_CREATE);
if (!bindResult) {
LogUtil.e(TAG, "can not bind connect service");
}
return bindResult;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
在bindService之前先调用一下startService激活一下就可以了。看到资料说android8.0可以调用startForgroundService来创建进程,具体也没怎么研究过,有兴趣的可以考虑下。
Android+GoLang+SprintBoot探讨群:186305789(疯狂的程序员),绝影大神在等你
有疑问加站长微信联系(非本文作者)