Android 解决AIDL bindService异常

Android 解决AIDL bindService异常

        • 问题1 bindService抛出异常java.lang.SecurityException: Not allowed to bind to service
        • 问题2 bindService抛出异常android bindService process is forbid to start by firewall
        • 问题3 bindService返回false

一直做嵌入式linux开发,不料前些日子产品要移植android平台,只好一边看各路android大神的博客,一边移植项目。语言还好说,基本都差不多;平台差异真的还是挺大的。

以往在linux平台中,IPC(进程间通信)大多会通过socket来实现。
切换到Android以后,发现有更简单高效的AIDL可以使用,于是想先写个demo尝试。

服务端我只定义了一个Service,客户端做了一个简单的Activity,上面有几个测试用的Button。于是就开始了坎坷的调试之路。

问题1 bindService抛出异常java.lang.SecurityException: Not allowed to bind to service

⇒ Manifest中service的exported属性设置为true

问题2 bindService抛出异常android bindService process is forbid to start by firewall

⇒ 服务端只有一个Service,后来随便加了一个Activity这个异常就解决掉了。难道android应用里不可以只有Service吗?我对此表示怀疑,应该会有更好方法去解决,如果有小伙伴知道,请指点一二。

问题3 bindService返回false

解决:这个问题困扰了我好久,网上找来的解决方案不少,但是没有对症的。直到后来看到了下面这篇文章
https://blog.csdn.net/jinrall/article/details/53465403

我的服务端app是com.test.aidltestserver,服务Service所在的包是com.test.aidltestserver.aidl。我在客户端中bindService时,创建Intent的代码如下

Intent intent = new Intent("com.test.aidltestserve.aidl.StartService");
intent.setClassName("com.test.aidltestserve.aidl", "com.test.aidltestserve.aidl.ConnectionService");
boolean ret = getApplicationContext().bindService(intent, conn, BIND_AUTO_CREATE);

问题就出在setClassName方法的第一个参数,这个参数的形参命是packageName,于是我就想当然的传入了包名"com.test.aidltestserve.aidl",但是事实上这个参数要传入的是ApplicationID,也就是**“com.test.aidltestserve”**。修改了参数以后,bindService终于成功了!

你可能感兴趣的:(Android)