2012-07-28 4 views
1

Je voudrais fournir un service qui peut être appelé par une autre application. Par conséquent, j'ai un service et un aide. Mais quand j'essaye d'avoir une application séparée pour lier ce service (bindService), cela me renvoie juste false ce qui signifie échouer. Voici mon code.bindService avec aidl return false

PS: Le contexte est déjà le ApplicationContext qui a obtenu en appelant getApplicationContext()

code qui tentent de lier le service

private static ServiceConnection connection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      sService = XXXService.Stub.asInterface(service); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      sService = null; 
     } 
    }; 

    private static synchronized XXXService getService(final Context context) { 
     if (sService != null) { 
      return sService; 
     } else { 
      intent.setClassName(context.getPackageName(), "com.xxx.someservice"); 
      if (context.bindService(intent, connection, Context.BIND_AUTO_CREATE)) { 
       Log.i(TAG, "can bind"); 
      } else { 
       Log.i(TAG, "can not bind"); 
      } 
      return sService; 
     } 
    } 

AndroidManifest

<service android:name="com.xxx.someservice" 
     android:process=":main" 
     android:exported="true"/> 

Répondre

1

Cela semble fondamentalement juste. Je pense que le problème est que intent.setClassName (context.getPackageName(), "com.xxx.someservice"); devrait être intent.setClassName ("Your.package.name.with.the.service", "com.xxx.someservice"); . context.getPackageName() renvoie le nom du paquet en cours, donc cela fonctionnerait si vous essayiez de lier votre propre paquet, mais votre question donne l'impression que vous le faites dans un paquet séparé. Utilisation d'un nom d'action pour le service a travaillé pour moi.

+0

Il fonctionne grâce – Bear

1

par exemple:

<service 
    android:name="..." 
    android:process="..." > 
    <intent-filter> 
     <action android:name="your-unique-action-name" /> 
    </intent-filter> 
</service> 

Et:

... 
bindService(new Intent("your-unique-action-name"), mServiceConnection, BIND_AUTO_CREATE); 
+0

Honnêtement, je pense l'utiliser avec vaut mieux, car il est plus robuste de refactoring. Mais fais attention. Votre code ci-dessus n'est pas sécurisé, car n'importe quelle application peut l'appeler. Assurez-vous simplement qu'il est protégé avec une permission et mieux encore si vous le pouvez. – Bishnu

+0

En termes de robustesse, votre code serait cassé si vous avez renommé la classe ou renommé votre paquet. Vous devriez vous rappeler de garder cela en phase. Il pourrait également être très difficile de changer plus tard, surtout si vous ne possédez pas l'autre code. – Bishnu

+0

@Bishnu Pourriez-vous en dire plus sur la sécurité, s'il vous plaît? Pourquoi le nom de l'action est plus robuste que simplement le nom de la classe? - Bear 5 mins ago – Bear