在我的应用程序中,我试图通过意图将可序列化对象传递给另一个活动。意图并非完全由我创建,它是通过搜索建议创建和传递的。
在搜索建议的内容提供程序中,创建对象并将其放置在MatrixCursor的SUGGEST_COLUMN_INTENT_EXTRA_DATA
列中。但是,当我在接收活动中调用getIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY)
时,返回的对象是String类型,我无法将其转换为原始对象类。
我尝试为我的对象调用out.writeSerializable(...)
制作一个parcelable包装,然后使用它,但同样的事情发生了。
返回的字符串就像一个通用的Object 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;
...
}
答案 0 :(得分:6)
Read my answer提出了类似的问题。基本问题是MatrixCursor
仅适用于基类型,并依赖于AbstractCursor
来填充CursorWindow
以在进程之间传递数据。 AbstractCursor
通过在每个行数据字段上调用Object#toString
来完成此操作。换句话说,您不能通过MatrixCursor
在进程之间传递任意对象。