gpt4 book ai didi

java - 在 Activity 之间共享数据的最佳方式是什么?

转载 作者:bug小助手 更新时间:2023-10-28 10:41:01 25 4
gpt4 key购买 nike

我有一个 Activity ,它是整个应用程序中使用的主要 Activity ,它有许多变量。我还有另外两项 Activity ,我希望能够使用第一项 Activity 中的数据。现在我知道我可以这样做:

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

但是我想分享很多变量,有些变量可能相当大,所以我不想像上面那样创建它们的副本。

有没有办法不使用 get 和 set 方法直接获取和更改变量?我记得在 Google 开发网站上读过一篇文章,说不建议在 Android 上使用此功能。

最佳答案

这里是 most common ways to achieve this 的汇编:

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

TL;DR:有两种共享数据的方式:在 Intent 的附加信息中传递数据或将其保存在其他地方。如果数据是原语、字符串或用户定义的对象:将其作为 Intent Extras 的一部分发送(用户定义的对象必须实现 Parcelable)。如果传递复杂对象,则将实例保存在其他地方的单例中,并从启动的 Activity 中访问它们。

如何以及为何实现每种方法的一些示例:

在 Intent 内发送数据

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

关于第二个 Activity :

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

如果您要传递原始数据或字符串,请使用此方法。您还可以传递实现 Serializable 的对象。

虽然很诱人,但在使用 Serializable 之前您应该三思而后行:它容易出错且速度极慢。所以总的来说:尽可能远离Serializable。如果你想传递复杂的用户定义对象,看看Parcelable接口(interface)。它更难实现,但与 Serializable 相比,它有相当大的速度提升。

共享数据而不保存到磁盘

可以通过将数据保存在内存中来在 Activity 之间共享数据,因为在大多数情况下,两个 Activity 都在同一个进程中运行。

注意:有时,当用户离开您的 Activity (没有退出)时,Android 可能会决定终止您的应用程序。在这种情况下,我遇到过 android 尝试使用应用程序被杀死之前提供的 Intent 启动最后一个 Activity 的情况。在这种情况下,存储在单例(您的或 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;}
}

来自已启动的 Activity :

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;}
}

Activity 开始前:

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

然后,从启动的 Activity :

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

静态字段

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

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

来自已启动的 Activity :

String data = DataHolder.getData();
WeakReferences

HashMap

同样的想法,但允许垃圾收集器移除未引用的对象(例如,当用户退出 Activity 时):

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();
}
}

Activity 开始前:

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

来自已启动的 Activity :

DataHolder.getInstance().retrieve(someId);

您可能需要也可能不需要使用 Intent 的附加功能来传递对象 ID。这完全取决于您的具体问题。

将对象持久化到磁盘

这个想法是在启动其他 Activity 之前将数据保存在磁盘中。

优点:您可以从其他地方启动 Activity ,如果数据已经持久化,它应该可以正常工作。

缺点:比较繁琐,需要更多时间来实现。需要更多代码,因此有更多机会引入错误。它也会慢得多。

一些持久化对象的方法包括:

关于java - 在 Activity 之间共享数据的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4878159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com