????????问题描述:安卓系统升级到11后,调用bindService一直返回flase,测试低版本正常。那么需要研究一下新版本特性。
1,管理软件包可见性
??????声明您的应用与一组特定的其他应用交互
????????如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台,并且需要与应用(自动可见的应用除外)交互,请在您应用的清单文件中添加?<queries> ?元素。在?<queries> ?元素中,按软件包名称、按 intent 签名或按提供程序授权指定其他应用,如以下部分所述。
????????查询特定软件包及与之交互
????????如果您知道要查询或与之交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),请将其软件包名称添加到?<queries> ?元素内的一组?<package> ?元素中:
<manifest package="com.cqrcb.test">
<queries>
<package android:name="com.cqrcb.paymentsdke" />
</queries>
...
</manifest>
??????在给定 intent 过滤器的情况下查询应用及与之交互
????????您的应用可能需要查询一组具有特定用途的应用或与之交互,但您可能不知道要添加的具体软件包名称。在这种情况下,您可以在?<queries> ?元素中列出?intent 过滤器签名。然后,您的应用就可以发现具有匹配的?<intent-filter> ?元素的应用。
<manifest package="com.cqrcb.test">
<queries>
<intent>
<action android:name="com.cqrcb.payment.service" />
</intent>
</queries>
...
</manifest>
? 2,解决问题
? ? ? ? 这里只展示部分代码,重点展示如何设置软件包可见性。?
????????服务端AndroidManifest.xml配置
<service
android:name="com.cqrcb.paymentsdk.services.AidlSService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.cqrcb.payment.service" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
? ? 客户端跨应用启动Service服务
private void bindAidlService() {
Intent intent = new Intent();
intent.setAction("com.cqrcb.payment.service");
intent.setPackage("com.cqrcb.paymentsdk");
boolean result = bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
Log.i(TAG, "bindAidlService: " + result);
}
? ?AndroidManifest.xml配置软件包可见性
? ?package 对应服务端的包名
? ?action 对应服务端的name
<queries>
<package android:name="com.cqrcb.paymentsdk" />
<intent>
<action android:name="com.cqrcb.payment.service" />
</intent>
</queries>
? ? 设置完再启动Service会发现还是不行,还需要把服务端设置为自启动。
? ? ?如果遇到添加queries报错,需要升级gradle与build版本
?总结一下就是在客户端设置软件包可见性、服务端设置为自启动。
?发现问题还是得查官方,最后附上文档:?管理软件包可见性 ?|? Android 开发者 ?|? Android Developers
|