在活动之间共享数据的最佳方式是什么?

问题:

我有一个活动是整个应用程序中使用的主要活动,它有一些变量。我还有另外两个活动,我想使用第一个活动的数据。
现在我知道我可以这样做:
class=”lang-java prettyprint-override”>

GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();

但是我想分享很多变量,有些变量可能相当大,所以我不想像上面那样创建它们的副本。
有没有办法直接获取和更改变量,而不使用get和set方法?我记得在Google开发人员网站上看过一篇文章,表示不推荐在Android上使用。

回答:

这里是most common ways to achieve this

  • 在意图内发送数据
  • 静态字段
  • WeakReferences的HashMap
  • 持久对象(sqlite,共享首选项,文件等)

 TL; DR:共享数据有两种方式:传递意图中的数据或将其保存在别的地方。如果数据是基元,字符串或用户定义的对象:作为意图扩展的一部分发送(用户定义的对象必须实现Parcelable)。如果传递复杂的对象将一个实例保存在其他地方的单例中,并从启动的活动中访问它们。
一些实现每种方法的方式和原因的例子:

在意图内发送数据

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);

第二个活动:

Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");

使用此方法如果您传递原始数据或字符串。您还可以传递实现Serializable的对象
虽然很诱人,但您应该在使用Serializable之前思考两次:这是错误的,可怕的缓慢。一般来说:保持距离如果可能的话。如果要传递复杂的用户定义对象看看吧。实施起来比较困难,但与Serializable相比,速度相当快。

共享数据而不持续到磁盘

通过将其保存在内存中,可以在活动之间共享数据,因为在大多数情况下,两个活动都在同一进程中运行。
 有时,当用户离开您的活动(不退出)时,Android可能会决定杀死您的应用程序。在这种情况下,我有经验的情况下,android尝试使用在应用程序被杀死之前提供的意图启动最后一个活动。在这种情况下,存储在单例中(您的或Application)的数据将会消失,并且可能会发生坏事。为了避免这种情况,您可以将对象持久保存到磁盘或检查数据,然后再使用它来确保其有效。

使用单身班

有一个类来保存数据:

public class DataHolder {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}

  private static final DataHolder holder = new DataHolder();
  public static DataHolder getInstance() {return holder;}
}

从推出的活动:

String data = DataHolder.getInstance().getData();

使用申请单身人士

应用程序单例是在应用启动时创建的android.app.Application的一个实例。您可以通过扩展Application来提供自定义的

import android.app.Application;
public class MyApplication extends Application {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}
}

开展活动之前:

MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);

然后,从推出的活动中:

MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();

静态字段

这个想法与单例基本相同,但在这种情况下,您提供对数据的静态访问:

public class DataHolder {
  private static String data;
  public static String getData() {return data;}
  public static String setData(String data) {DataHolder.data = data;}
}

从推出的活动:

String data = DataHolder.getData();

HashMap的

相同的想法,但允许垃圾回收器去除未引用的对象(例如,当用户退出活动时):

public class DataHolder {
  Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();

  void save(String id, Object object) {
    data.put(id, new WeakReference<Object>(object));
  }

  Object retrieve(String id) {
    WeakReference<Object> objectWeakReference = data.get(id);
    return objectWeakReference.get();
  }
}

开展活动之前:

DataHolder.getInstance().save(someId, someObject);

从推出的活动:

DataHolder.getInstance().retrieve(someId);

您可能需要或可能不必使用intent的附加组件传递对象标识。这一切都取决于你的具体问题。

将对象持续到磁盘

这个想法是在启动其他活动之前将数据保存在磁盘中。
 优点:您可以从其他地方启动活动,如果数据已经持续存在,则应该可以正常工作。
 缺点:它很麻烦,需要更多的时间来实现。需要更多的代码,因此更有可能引入错误。它也会慢得多。
持久化对象的一些方法包括:

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What’s the best way to share data between activities?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

3 + 7 =