2010-06-16 32 views
4

在我的應用程序中,我試圖通過意圖將可序列化的對象傳遞給另一個活動。意圖不是完全由我創建的,它是通過搜索建議創建和傳遞的。可串行化的對象意圖以字符串形式返回

在搜索建議的內容提供者中,創建對象並將其放置在MatrixCursor的SUGGEST_COLUMN_INTENT_EXTRA_DATA列中。但是,在接收活動中,我調用getIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY)時,返回的對象是String類型,我無法將其轉換爲原始對象類。

我試着爲我的對象製作一個可打包的包裝,它調用out.writeSerializable(...),然後用它代替,但是同樣的事情發生了。

返回的字符串就像一個普通的Object toString(),即[email protected],所以我假設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; 
    ... 
} 

回答

6

Read my answer到類似的問題。基本問題是MatrixCursor僅適用於基本類型,並且取決於AbstractCursor填充CursorWindow以在進程之間傳遞數據。 AbstractCursor通過在每行數據字段上調用Object#toString來完成此操作。換句話說,您不能通過MatrixCursor在進程之間傳遞任意對象。

相關問題