Ich habe auf alle anderen StackOverflow-Posts zu diesem Problem verwiesen und kann nicht richtig funktionieren.onServiceConnected() nicht aufgerufen, wenn AIDL zwischen zwei Apps verwendet wird
Mein Ziel ist es, eine App ohne Hauptaktivität zu schreiben, nur ein Service. Sie sollten in der Lage sein, von einer separaten App aus zu binden und mit AIDL zu interagieren.
Ich hatte zuvor sowohl den Service und die Aktivität in der gleichen App aufrufen und es funktionierte einwandfrei. Aber ich muss es zwischen zwei getrennten Apps arbeiten lassen.
Die onBind() des Dienstes sieht wie folgt aus:
@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;
}
}
Der Service selbst an einen anderen Dienst bindet, aber alle von dem Zeug Bluetooth funktioniert bereits.
Das Manifest der App mit dem Service sieht wie folgt aus:
<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>
In meiner Tätigkeit habe ich daran binden diese wie:
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));
Die AIDL-Dateien haben in beiden Anwendungen den exakt gleichen Paketnamen.
Keine Ausnahme wird aufgerufen, alles funktioniert außer onServiceConnected wird nicht aufgerufen.
bindService() gibt true zurück, der Dienst empfängt die Absicht und wird ordnungsgemäß gestartet, "den Dienst zurückgegeben" wird protokolliert, aber onServiceConnected() wird nie aufgerufen.
Eine Android-App muss eine Art UI-Interaktion vom Benutzer haben, bevor sie Hintergrunddienste ausführen kann, vielleicht ist das ein Teil Ihres Problems? Siehe https://stackoverflow.com/questions/8531926/how-to-start-a-service-when-apk-is-installed-the-first-time-. –
@ScottKronheim Ich habe es laufen. Anscheinend müssen Sie das Paket in der Absicht zu dem Paket der Service-App zusätzlich zu der Komponente festlegen. Ich brauche den Dienst nicht, sobald die Service-App installiert ist. Ich brauche den Dienst, sobald eine andere App an ihn gebunden ist. – MethDamon