2012-02-07 177 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

相关问题