5

私のアプリケーションでは、シリアライズ可能なオブジェクトをインテントを介して別のアクティビティに渡そうとしています。インテントは私が完全に作成したものではなく、検索候補に作成されて渡されます。

検索候補のコンテンツプロバイダーでは、オブジェクトが作成されSUGGEST_COLUMN_INTENT_EXTRA_DATA、MatrixCursorの列に配置されます。ただし、受信アクティビティでを呼び出すgetIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY)と、返されるオブジェクトはString型であり、元のオブジェクトクラスにキャストできません。

代わりにそれを呼び出して使用するオブジェクトのパーセル可能なラッパーを作成しようとしましたout.writeSerializable(...)が、同じことが起こりました。

返される文字列は、ジェネリックオブジェクトtoString()のようなものです。つまりcom.foo.yak.MyAwesomeClass@4350058、toString()は、制御できない場所で呼び出されていると想定しています。

うまくいけば、私は単純なものが欠けているだけです。助けてくれてありがとう!

編集:私のコードの一部

これは、検索機関として機能するコンテンツプロバイダーにあります。

//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;
}

これは、検索候補を受け取るアクティビティにあります。

 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;
    ...
 }
4

1 に答える 1

6

同様の質問に対する私の答えを読んでください。基本的な問題は、基本タイプでのみ機能し、プロセス間でデータを渡すためにを埋めることにMatrixCursor依存することです。これを行うには、すべての行のデータフィールドを呼び出します。つまり、を介してプロセス間で任意のオブジェクトを渡すことはできません。AbstractCursorCursorWindowAbstractCursorObject#toStringMatrixCursor

于 2010-06-16T22:42:48.527 に答える