2017-12-28 29 views
0

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.

+0

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-. –

+0

@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

Antwort

0

Ich habe es ausgeführt wird, was fehlte, war

intent.setPackage("io.modum.modum_ble_service) 

Beachten Sie, dass der Paketname der Name der App ist, nicht das Paket der Service ist in. Den Paketnamen in LogCat angezeigt verwenden.

Verwandte Themen