Android 11 解决跨应用绑定Service失败

        问题描述:安卓系统升级到11后,调用bindService一直返回flase,测试低版本正常。那么需要研究一下新版本特性。

1,管理软件包可见性

      声明您的应用与一组特定的其他应用交互

        如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台,并且需要与应用(自动可见的应用除外)交互,请在您应用的清单文件中添加  元素。在  元素中,按软件包名称、按 intent 签名或按提供程序授权指定其他应用,如以下部分所述。

        查询特定软件包及与之交互

        如果您知道要查询或与之交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),请将其软件包名称添加到  元素内的一组  元素中:


    
        
    
    ...

      在给定 intent 过滤器的情况下查询应用及与之交互

        您的应用可能需要查询一组具有特定用途的应用或与之交互,但您可能不知道要添加的具体软件包名称。在这种情况下,您可以在  元素中列出 intent 过滤器签名。然后,您的应用就可以发现具有匹配的  元素的应用。


    
        
            
        
    
    ...

  2,解决问题

        这里只展示部分代码,重点展示如何设置软件包可见性。 

        服务端AndroidManifest.xml配置

    
        
            
            
        
    

    客户端跨应用启动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

    
        
        
            
        
    

    设置完再启动Service会发现还是不行,还需要把服务端设置为自启动

Android 11 解决跨应用绑定Service失败_第1张图片

     如果遇到添加queries报错,需要升级gradle与build版本

Android 11 解决跨应用绑定Service失败_第2张图片

 总结一下就是在客户端设置软件包可见性、服务端设置为自启动。

 发现问题还是得查官方,最后附上文档: 管理软件包可见性  |  Android 开发者  |  Android Developers

你可能感兴趣的:(android,android)