在两个应用程序之间使用AIDL时未调用onServiceConnected()

问题描述 投票:0回答:1

我提到了有关此问题的所有其他StackOverflow帖子,我无法让它正常工作。

我的目标是编写一个没有主要活动的应用程序,只需一项服务。您应该能够从单独的应用程序绑定到它并使用AIDL与它进行交互。

我以前有同一个应用程序中的服务和活动调用它,它完美无缺。但我需要让它在两个单独的应用程序之间工作。

该服务的onBind()如下所示:

@Nullable
@Override
public IBinder onBind(Intent intent) {
    // This binds the bluetooth service itself to the logger service, do this when the logger service itself is bound
    Intent serviceIntent = new Intent(this, BluetoothService.class);
    intent.setPackage(this.getPackageName());
    Log.d(getClass().getName(), "started");

    if(bluetoothService == null) {
        if (this.bindService(serviceIntent, bluetoothServiceConnection, BIND_AUTO_CREATE)) {
            Log.d(getClass().getName(), "returned the service");
            return mBinder;
        } else {
            Log.d(getClass().getName(), "returned null");
            return null;
        }
    } else {
        Log.d(getClass().getName(), "returned the service");
        return mBinder;
    }
}

服务本身绑定到另一个服务,但所有的蓝牙功能已经完成。

使用该服务的应用程序的清单如下所示:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application
    android:label="@string/app_name">
    <service
        android:label="LoggerService"
        android:name="io.modum.ble.LoggerService"
        android:exported="true">
        <intent-filter>
            <action android:name="io.modum.ble.LoggerService" />
        </intent-filter>
    </service>
    <service android:name="io.modum.ble.service.BluetoothService" />
</application>

在我的活动中,我这样绑定它:

    Intent intent = new Intent();
    ComponentName componentName = new ComponentName("io.modum.modum_ble_service", "io.modum.ble.LoggerService");
    intent.setComponent(componentName);

    boolean success = getApplicationContext().bindService(intent, new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(getClass().getName(), "Service connected");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }, BIND_AUTO_CREATE);
    Log.d(getClass().getName(), String.valueOf(success));

AIDL文件在两个应用程序中具有完全相同的包名称。

没有异常被调用,除了onServiceConnected之外,一切都有效。

bindService()返回true,服务接收到intent并正确启动,“返回服务”被记录,但永远不会调用onServiceConnected()。

android service bind aidl
1个回答
0
投票

我让它运行,缺少的是

intent.setPackage("io.modum.modum_ble_service)

请注意,程序包名称是应用程序的名称,而不是服务所在的程序包。使用LogCat中显示的程序包名称。

© www.soinside.com 2019 - 2024. All rights reserved.