您可以在活动之间交换数据的另一种方式

时间:2013-11-15 14:15:10

标签: java android eclipse

运行应用程序时,静态字段与存储数据中的其他方式有何不同? 我正在使用静态字段在活动之间传递数据并且工作得很好:

我定义了这个类:

public class Info 
{
    public static int ID      = 0;
    public static String NAME = "TEST";
    public static TestClass testclass = null;
}

我可以将数据存储在任何地方:

Info.ID = 5;
Info.NAME = "USER!";
Info.testclass = new TestClass();

我可以随时随地获取数据:

Info.ID
Info.NAME
Info.testclass

6 个答案:

答案 0 :(得分:3)

通常在intent中使用extras在活动之间传递数据。这些数据在接收活动的生命周期中持续存在(完成后,垃圾收集器可以释放内存)。

或者您可以使用SharedPreferences存储值。这些将在会话之间保留,并作为键/值对存储在文件中(因此不会影响内存使用)。

或者您可以在静态字段中保存值(正如您在此处所做的那样),这些值在应用程序会话的生命周期中持续存在。但是,这有一个很大的风险,因为垃圾收集器无法释放这些字段引用的内存,除非在不再需要引用时将它们设置为null。您永远不应该在静态字段中存储对活动/上下文/视图的引用,因为您将泄漏整个活动,这可能导致大量内存使用。

http://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html

如果它是Serializable,你可以在一个intent中传递一个类实例,例如:

Intent intent = new Intent(this, whatever.class);
Bundle b = new Bundle();
b.putSerializable("data", my_object);
intent.putExtras(b);
startActivity(intent);

在接收活动中,将其强制转换为您的对象所在的任何类:

Bundle b = getIntent().getExtras();
my_object = (whatever class is it) b.getSerializable("data");

许多java类实现了Serializable,并且使自己的类可序列化也非常简单。

答案 1 :(得分:2)

如果您正在更改活动,我假设您正在使用intent。您可以做的是使用intent myIntent.putExtra("some string",someString);发送数据。

然后,您可以使用

在新活动中接收信息
Intent intent = getIntent();
String someString = intent.getExtra("some string");

答案 2 :(得分:0)

您可以使用意图在活动之间传递数据。 你的第一个Activity.java

public void onClick(View v)
  {
      Intent timer = new Intent (FirstActivity.this,SecondActivity.class);
      timer.putExtra("beefType", 5000);
      startActivity(timer);
  }

然后在您的SecondActivity.java文件中执行:

nt beefType = getIntent().getIntExtra("beefType", -1);

答案 3 :(得分:0)

您希望在活动之间共享数据,您可以使用意图或共享偏好。 使用这些拖曳和静态数据的不同之处在于,某些静态数据的意图和共享优先级可能为空或为空。但使用上述两种方法发送数据可保证您将在下一个活动中获取数据,除非您强行删除首选项  您可以参考此链接获取更多信息Static class in Java (Android) - use or not use

答案 4 :(得分:0)

在android中有一个叫做Application Class的东西。它就像一个全球单身人士。

  • 换句话说,该应用程序类对于整个应用程序是通用的。
  • 应用程序类将是要加载的第一个类。

因此,在应用程序类中存储一些随机使用的值会更容易。

public class Info extends Application 
{     
     public static int ID      = 0;
     public static String NAME = "TEST";
}

然后通过以下方式在任何活动中调用它:

Info info= ((YourApplication)this.getApplication());

在你的清单中:

<application
android:name="<your package name>.GlobalApplication">

........
........

</application>

答案 5 :(得分:0)

嗯,这种方式在Android中并不总是有效。只有在您的应用运行时,您的静态值才会保留。想象一下,您正在与行动SEND共享一些内容,因此您正在启动另一个实际共享您的内容的应用程序(Facebook,电子邮件等)。如果没有足够的资源来启动其他应用,Android可能会决定完全停止您的应用。在这一点上,您的应用程序的过程完全消失了,并且随之而来的是您的静态值。从共享内容的应用返回您的应用时,您已经失去了价值。

如果你需要序列化更复杂的数据,我最好使用Intent extras和Parcelable对象。

如果您在设备中启用不要保留活动选项,则可以轻松尝试使用该选项,这会在用户离开后立即销毁所有活动。