2017-12-28 22 views
0

この問題について他のすべてのStackOverflow記事を参照しましたが、正しく動作させることができません。2つのアプリケーション間でAIDLを使用しているときにonServiceConnected()が呼び出されていない

私の目標は、主要なアクティビティがなく、サービスだけを書くことです。別個のアプリケーションからバインドし、AIDLを使用してそのアプリケーションとやりとりすることができます。

私はこれまで同じサービスでそれを呼び出すサービスとアクティビティの両方を持っていましたが、完璧に機能しました。しかし、私はそれを2つの別々のアプリケーションの間で動作させる必要があります。

サービスの[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; 
    } 
} 

サービス自体は別のサービスに結合するが、bluetoothのもののすべてがすでに動作します。サービスとアプリのマニフェストは、次のようになります

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)); 

:私の活動で

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

、私はこのようにそれに特異的に結合しますAIDLファイルは、両方のアプリケーションでまったく同じパッケージ名を持っています。

例外は呼び出されず、すべてonServiceConnectedが呼び出されない限り動作します。

bindService()はtrueを返します。サービスはインテントを受け取り、正しく開始され、「返されたサービス」は記録されますが、onServiceConnected()は呼び出されません。

+0

Androidアプリは、バックグラウンドサービスを実行する前に、ユーザーからの何らかの種類のUI操作を必要としています。これはおそらく問題の一部ですか? https://stackoverflow.com/questions/8531926/how-to-start-a-service-when-apk-is-installed-for-the-first-timeを参照してください。 –

+0

@ScottKronheim私はそれを走らせた。どうやら、コンポーネントに加えて、サービスアプリケーションのパッケージへの意図でパッケージを設定する必要があります。サービスアプリがインストールされるとすぐにサービスを実行する必要はありません。他のアプリがバインドするとすぐにサービスを実行する必要があります。 – MethDamon

答えて

0

私はそれが欠けていたものを、実行しましたが、パッケージ名はアプリの名前ではなく、サービスをしているパッケージであることを

intent.setPackage("io.modum.modum_ble_service) 

注意した。LogCatに表示されたパッケージ名を使用してください。

関連する問題