2010-09-06 9 views
2

J'ai besoin des applications tierces ("Foo") pour obtenir des informations de ma demande ("Bar"), mais ma solution semble jusqu'ici lourde:Comment puis-je demander des informations à partir d'une autre application Android?

  • application Foo a besoin d'informations de Bar et envoie une émission (» bar.POLL ").
  • La barre d'application est à l'écoute de cette diffusion et répond avec une autre diffusion ("bar.PUSH");
  • Foo écoute bar.PUSH et lit le contenu de l'ensemble inclus.

Existe-t-il un moyen plus direct de le faire?

EDIT: Je l'ai résolu avec un ContentProvider extrêmement simpliste Guido suggéré:

public class MyProvider extends ContentProvider { 
    private String state = ""; 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    MatrixCursor cursor = new MatrixCursor(new String[]{"state"}); 
    cursor.addRow(new Object[]{state}); 
    return cursor; 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
    state = (String) values.get("state"); 
    return 1; 
    } 

    @Override 
    public boolean onCreate() { 
    return true; 
    } 

    @Override 
    public String getType(Uri uri) { 
    return null; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
    return null; 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
    return 0; 
    }  
} 

Rappelez-vous d'ajouter le fournisseur au manifeste:

<provider android:name=".MyProvider" android:authorities="com.example.hello" /> 

Mise à jour de l'état d'une activité comme ce:

ContentValues cv = new ContentValues(); 
cv.put("state", "myNewState"); 
getContext().getContentResolver().update(Uri.parse("content://com.example.hello"), cv, null, null); 

obtenir le contenu du fournisseur dans l'application externe:

Cursor cur = managedQuery(Uri.parse("content://com.example.hello"), null, null, null, null); 
if (cur.moveToFirst()) { 
    String myContent = cur.getString(0); 
} 
+0

Merci, utile – orip

Répondre

5

Vous devriez exposer une ContentProvider.

« Les fournisseurs de contenu stocker et récupérer les données et les rendre accessibles à toutes les applications Ils sont la seule façon de partager des données entre les applications;. Il n'y a pas de zone de stockage commune que tous les paquets Android peuvent accéder. »

Les fournisseurs de contenu implémentent une interface commune pour interroger le fournisseur et renvoyer les résultats. Ce n'est pas difficile à mettre en place, mais peut-être que la documentation officielle n'est pas la meilleure pour commencer. Vous pouvez trouver d'autres exemples à:

+0

Vous pouvez également essayer d'utiliser un service. Cela dépend de ce que vous voulez stocker/envoyer – Falmarri

+1

Falmarri: J'aurais toujours besoin d'une forme de méthode RPC, non? J'utilise déjà des diffusions au sein d'un service. – neu242

+0

Si vous utilisez ContentProvider, vous pouvez interroger les données dont vous avez besoin en demandant un ContentResolver pour un URI donné. Je ne comprends pas pourquoi vous auriez besoin de RPC ici. Un contenu fourni est la manière naturelle de le faire, IMO. –