私のアプリケーションでは、シリアライズ可能なオブジェクトをインテントを介して別のアクティビティに渡そうとしています。インテントは私が完全に作成したものではなく、検索候補に作成されて渡されます。
検索候補のコンテンツプロバイダーでは、オブジェクトが作成され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;
...
}