运行应用程序时,静态字段与存储数据中的其他方式有何不同? 我正在使用静态字段在活动之间传递数据并且工作得很好:
我定义了这个类:
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
答案 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对象。
如果您在设备中启用不要保留活动选项,则可以轻松尝试使用该选项,这会在用户离开后立即销毁所有活动。