2010-06-16 3 views
4

Dans mon application, j'essaie de transmettre un objet sérialisable via une intention à une autre activité. L'intention n'est pas entièrement créée par moi, elle est créée et transmise à travers une suggestion de recherche.Objet sérialisable dans l'intention renvoyant sous forme de chaîne

Dans le fournisseur de contenu pour la suggestion de recherche, l'objet est créé et placé dans la colonne SUGGEST_COLUMN_INTENT_EXTRA_DATA de MatrixCursor. Cependant, lorsque dans l'activité de réception j'appelle getIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY), l'objet retourné est de type String et je ne peux pas le convertir dans la classe d'objet d'origine.

J'ai essayé de créer un wrapper parcelable pour mon objet qui appelle out.writeSerializable(...) et l'utilise à la place mais la même chose s'est produite.

La chaîne renvoyée est semblable à Object toString générique(), c'est-à-dire [email protected], donc je suppose que toString() est appelée quelque part où je n'ai aucun contrôle.

J'espère qu'il me manquera quelque chose de simple. Merci pour l'aide!

Edit: Certains de mon code

Ceci est le fournisseur de contenu qui agit en tant qu'autorité de recherche:

//These are the search suggestion columns 
private static final String[] COLUMNS = { 
    "_id", // mandatory column 
    SearchManager.SUGGEST_COLUMN_TEXT_1, 
    SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA 
}; 

//This places the serializable or parcelable object (and other info) into the search suggestion 
private Cursor getSuggestions(String query, String[] projection) { 
    List<Widget> widgets = WidgetLoader.getMatches(query); 

    MatrixCursor cursor = new MatrixCursor(COLUMNS); 
    for (Widget w : widgets) { 
     cursor.addRow(new Object[] { 
          w.id 
          w.name 
          w.data //This is the MyAwesomeClass object I'm trying to pass 
          }); 
    } 

    return cursor; 
} 

Ceci est l'activité qui reçoit la suggestion de recherche:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Object extra = getIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY); 
    //extra.getClass() returns String, when it should return MyAwesomeClass, so this next line throws a ClassCastException and causes a crash 
    MyAwesomeClass mac = (MyAwesomeClass)extra; 
    ... 
} 

Répondre

6

Read my answer à une question similaire. Le problème de base est que le MatrixCursor ne fonctionne que pour les types de base et dépend du AbstractCursor pour remplir le CursorWindow pour transmettre les données entre les processus. AbstractCursor cela fait en appelant Object#toString sur chaque champ de données de ligne. En d'autres termes, vous ne pouvez pas passer d'objets arbitraires entre les processus via un MatrixCursor.

Questions connexes