SDK开发:AIDL通信中bindService无法正确onServiceConnected的问题

解决方案

  将跨进程通信模块封装到SDK中,配置到目标APK中,结果发现服务连不上了,四处Log,结果发现ServiceConnection接口中的onServiceConnected压根没有回调,看来bindService没有发挥作用。

	Intent intent = new Intent();
	intent.setAction("com.jason.aidlconnection");
	intent.setPackage("com.jason.aidlsdk");
	bindService(intent, new ConnectionClient(), Context.BIND_AUTO_CREATE);

  排查了一下,进程内的本地服务可以连接,但是进程间的远程服务却无法连接,看来和setActionsetPackage有关,查了一下资料,果然如此:使用SDK的方式将AIDL配置到其他APK中,setPackage的包名应该是APK的包名,而不是SDK的包名,把之前的setPackage改成SDK包名即可:

	intent.setPackage("com.jason.aidlapk");

其他原因

  为了解决这个问题查了很多资料,貌似导致服务连不上的原因挺多的,这里总结一下:

忘记注册

  常见情况,手动创建的Service,AS不会添加任何注册代码,更不会报错,只有一个弱弱的提示。

		<service android:name=".SDKService">
            <intent-filter>
                <action android:name="com.jason.text"/>
                <category android:name="com.jason.category.DEFAULT"/>
            </intent-filter>
        </service>

Activity层次影响

  如果Activity调用层次比较多,比如A调用了B,而服务在A中注册,在B中Intent,那么可能需要A的上下文环境:

	mContext.getApplicationContext().bindService

系统权限

  国内定制Android处于节电或者性能的考虑,都会限制APP之间的联动,每家厂商的设置会有所不同,如果不是系统级APP开发,可能会因此受限而导致服务连接不成功。这个时候需要手动设置应用所有权限

服务连接时机

  尽可能把bindService放在onCreate中进行操作,或APP初始化时执行,服务连接有些时候需要一个时间间隔,尽管很小,但是有可能会影响到远程通信,所以不要等到调用AIDL接口的时候才开始bind。

发布了222 篇原创文章 · 获赞 558 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/CV_Jason/article/details/101598057
今日推荐