2012-02-07 98 views
3

我正在使用不同的進程(在我的清單中使用android:進程)能夠在我的應用程序中使用多個mapView(How to use multiple MapActivities/MapViews per Android application/process)。 2個地圖在不同的活動和我的一般tabhost不同的選項卡。如何在兩個進程之間共享數據

否我想要縮放到特定位置,該位置是通過其他活動中的用戶選擇的。使用靜態變量不起作用。之後,我嘗試將數據保存到SharedPreferences文件中,並在MapActivity中再次讀取它。但是這也行不通。數據成功寫入,但MapActivity在SharedPreferences中找不到任何數據。

是否有可能在兩個或多個進程之間共享數據?

保存的位置數據:

public static boolean addLocationToShared(float lat, float lon){ 
    Log.i(TAG, "addLocationToShared: " + lat + "," + lon); 
    if(mapShared==null) 
     mapShared = TLApplication.getAppContext().getSharedPreferences(MAP_SHARED_PREFS, Context.MODE_PRIVATE); 
    return mapShared.edit().putFloat(PREF_LAT, lat).putFloat(PREF_LON, lon).commit(); 
} 

讀取位置數據:

mapShared = TLApplication.getAppContext().getSharedPreferences(MAP_SHARED_PREFS, Context.MODE_PRIVATE); 
float lat = mapShared.getFloat(PREF_LAT, 1000); 
float lon = mapShared.getFloat(PREF_LON, 1000); 
Log.d(TAG, "zoom to " + lat + ", " + lon); 
if(lat != 1000 && lon != 1000){ 
    GeoPoint point = new GeoPoint((int)(lat * 1E6), (int)(lon * 1E6)); 
    zoomToLocation(point, 15); 
} 

回答

1

我認爲Android Interface Definition Language (AIDL)可能是你的答案在這裏。我用它來在應用程序和從單獨的apk運行的遠程服務之間進行通信。如果你只是傳遞一些花車,那麼編組數據不應該那麼複雜。

+0

感謝您的回答。我看過它,但沒有得到兩個活動的工作。另外我認爲這對於我的目的來說是一點點的過載 – AlexVogel 2012-02-08 09:08:59

0

我試過JPriest和NickT的答案,但他們要麼沒有工作,要麼過載。 我結束了將數據保存到文件並在另一個進程中再次讀取它。不是一個很好的解決方案,但至少它工作。

3

一個簡單的方法是SharedPreferences。使用'Context.MODE_MULTI_PROCESS'標誌來獲得您的共享首選項。

在寫進程:

SharedPreferences preferencesWriter = basedContext.getSharedPreferences("Keeps_a_constant_preferences_file_name", Context.MODE_MULTI_PROCESS); 
preferencesWriter.edit().putString(someKey, savingValue).commit(); 

在讀寫過程:

SharedPreferences preferencesReader = basedContext.getSharedPreferences("Keeps_a_constant_preferences_file_name", Context.MODE_MULTI_PROCESS); 
String savedValueInWriterProcess = preferencesWriter.getString(someKey, defaultValue); 

注:在閱讀過程中,你必須檢索新鮮SharedPreferences變體每一個時間,以確保共同的價值將被刷新。

其他方法: 1.發送帶有額外數據的廣播; 2.內容提供者。

+0

一個重要的注意事項:確保在寫入prefs時使用'.commit()'而不是'.apply()'以確保數據在您之前被寫出從另一個進程讀取它。從文檔中可以看出:「與commit()不同,'apply()'將它的首選項同步寫入持久化存儲,'apply()'立即將其更改提交到內存中的'SharedPreferences',但開始異步提交到磁盤,不會收到任何失敗的通知....''SharedPreferences'實例在進程** [強調添加]中是單例**「。 – 2014-11-01 19:29:46

+4

根據文檔,Context.MODE_MULTI_PROCESS被視爲棄用,因爲它在所有情況下都不一致。 – mdavid 2015-09-16 11:22:02

+1

SharedPreferences不支持多進程。官方文檔聲明:注意:此類不支持跨多個進程使用。 – Warpzit 2016-11-18 11:35:49

相關問題