Android:在活动之间传递哈希映射

我有一个string和类对象之间的映射。 我在Activity1中填充这个地图,我想把它传递给activity2。

public class NEW extends Activity { public class data { String name; float value; .... etc } ...... static Map<String, data> data_map = new HashMap<String, data>(); ..... } 

我假设你拥有两个活动(称他们为A和B)。 在这种情况下,只需将地图放在一个公共静态variables中,并通过A.data_map从B中访问它。

[更新]

对于所有downvotes,请仔细阅读Android应用程序框架FAQ部分“如何在单个应用程序内的活动/服务之间传递数据?”。 我推荐的解决scheme与…完全一样

公共静态字段/方法

使活动/服务可访问数据的另一种方法是使用公共静态字段和/或方法。 您可以从应用程序中的任何其他类访问这些静态字段。 要共享一个对象,创build对象的活动设置一个静态字段来指向这个对象,任何其他想要使用这个对象的活动都只是访问这个静态字段。

是的,这个解决scheme有一些注意事项,但是由于OP提供的信息有限,我们不能假定这种方法是行不通的。

要做到这一点,最好的方法是如果你可以在Bundle所支持的原语中expression你的数据,那么它可以放在你通过Intent.putExtra()方法发送的Intent中。 (除了使用Serializable,这是非常缓慢和低效的。)

但是,您不能这样做,因为(a)您正在使用地图,(b)您的地图包含自定义数据types。

正确地解决这个问题的正确方法是编写一个自定义的Parcellable类,负责编组/解组数据结构。 我将在这里勾画出这个代码,虽然它可能不完全正确:

 import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable.Creator; public class MyData implements Parcelable { HashMap<String, data> data_map = new HashMap<String, data>(); public MyData() { } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int parcelableFlags) { final int N = data_map.size(); dest.writeInt(N); if (N > 0) { for (Map.Entry<String, data> entry : data_map.entrySet()) { dest.writeString(entry.getKey()); data dat = entry.getValue(); dest.writeString(dat.name); dest.writeFloat(dat.value); // etc... } } } public static final Creator<MyData> CREATOR = new Creator<MyData>() { public MyData createFromParcel(Parcel source) { return new MyData(source); } public MyData[] newArray(int size) { return new MyData[size]; } }; private MyData(Parcel source) { final int N = source.readInt(); for (int i=0; i<N; i++) { String key = source.readString(); data dat = new data(); dat.name = source.readString(); dat.value = source.readFloat(); // etc... data_map.put(key, dat); } } } 

请注意,如果您有像“data”类这样的自定义数据结构,那么也可以使得Parcellable更清晰,因此它知道如何在Parcel中读取/写入其内容,并且此处的代码只会调用.writeToParcel …)和一个.readFromParcel(…)方法,而不知道其内容的细节。 这样,当你添加新的字段到“数据”,你不会忘记也更新这个其他编组代码,以了解他们。

我会build议使用Intents,它既适用于静态对象也适用于任意对象(只要它们实现Serializable)。 为你的应用程序创build一个自定义的Intent ,然后把你的HashMap(不是一个没有实现Serializable的Map)作为额外的数据传递给它:

 Intent act2 = new Intent(Activity2.SHOW_ME); act2.putExtra("data", data_map); 

然后在Activity2中,可以调用getIntent()并通过Intent.getAction().equals(Activity2.SHOW_ME)是否是调用Activity的人。 如果是这样,您可以通过访问您的额外数据

 Intent caller = getIntent(); if (caller.getAction().equals(Activity2.SHOW_ME)) { Map<String, NEW.data> data_map = (Map<String, NEW.data>)caller.getExtras().get("data"); } 

希望我input正确的一切;)这假定,你的意图行动string存储为static final string SHOW_ME = "yourpackage.yourname"; 在Activity2中。

如果您需要进一步澄清,请添加评论。

您可以将数据封装在绑定服务中,如本文档中所述:

http://developer.android.com/guide/topics/fundamentals/bound-services.html

不要忘记将您的服务器添加到清单文件。

这个解决scheme的优点是从您的用户界面解耦您的数据,这将最终导致更可维护的devise。

如果需要出现,您可以添加一个消息包装到您的服务的API,以允许从其他进程/应用程序调用它

创build一个新的Java文件,这将是整个应用程序的全局。

第一步

 public class GlobalClass extends android.app.Application { public static Map<String, NEW.data> data_map = new Map<String, NEW.data>(); } 

第二步

完成之后,在AndroidManifest.xml中注册这个“GlobalClass”

 <application android:name=".GlobalClass" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > </application> 

第三步

现在,您可以在应用程序的任何位置使用此Map。

 @Override protected void onCreate(Bundle icicle) { GlobalClass global = (GlobalClass)getApplication(); Map<String, NEW.data> my_map_data = global.data_map; } 

这些步骤可能对你有帮助…