我提到了有关此问题的所有其他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()。
我让它运行,缺少的是
intent.setPackage("io.modum.modum_ble_service)
请注意,程序包名称是应用程序的名称,而不是服务所在的程序包。使用LogCat中显示的程序包名称。