在API 30中,BindService返回false

3
当我使用compileSdkVersion 30运行我的代码时,它无法工作,但在29中可以正常工作。
Intent intent = new Intent();
intent.setPackage("com.androidlearn.securityman");

ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.e("","");
        Toast.makeText(context,"onServiceConnected",Toast.LENGTH_LONG).show();
        listener.onSuccess(IPaymentInterface.Stub.asInterface(service));
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Toast.makeText(context,"onServiceDisconnected",Toast.LENGTH_LONG).show();
        Log.e("","");
        listener.onFailure("connection failed");

    }
};
context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

在API 30中,bindService返回false,并且serviceConnection无法响应监听器。

如何解决这个问题?


在Android 11上使用前台服务的方法有一些不同...你可以从那里开始。 - emandt
我只使用 Binder IPC,而不是前台服务。 - android developer
当您调用“bindService”时,“context”是否有效和活动的?如果您尝试从已停止/完成的Activity绑定到Service,则会返回FALSE。 - emandt
是的,活动正在运行。问题只出现在API 30及以下版本上,没有任何问题。 - android developer
1个回答

4
可能与Android 11引入的软件包可见性设置有关。当您拥有两个应用程序:一个提供服务的服务器和想要绑定该服务的客户端时,客户端需要在其清单中声明可以使用服务包,例如:
<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>


否则,绑定将返回false,并且在系统范围的Logcat中,您将看到类似以下内容的信息:
I/AppFilter: Interaction: PackageSetting {<client.app.package/PID> -> <server.app.package/PID>} Blocked
W/ActivityManager: Unable to start service Intent { act=<action> pkg=<server.app.package>} U=0: not found

如果没有这个清单声明,服务器应用程序服务对客户端应用程序将是不可见的。如果您想检查意图数据是否正确,仍然可以通过adb启动它。

更多信息:https://developer.android.com/training/package-visibility/declaring


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接