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

Java 您可以在活动之间交换数据的另一种方式,java,android,eclipse,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 = "

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

我定义了这个类:

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
我可以在任何地方获取数据:

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

可以使用意图在活动之间传递数据。 您的第一个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);

可以使用意图在活动之间传递数据。 您的第一个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);

如果您正在更改活动,我假设您正在使用
intent
s。您可以使用
intent
myIntent.putExtra(“some string”,someString)发送数据

然后,您可以使用接收新活动中的信息

Intent intent = getIntent();
String someString = intent.getExtra("some string");

如果您正在更改活动,我假设您正在使用
intent
s。您可以使用
intent
myIntent.putExtra(“some string”,someString)发送数据

然后,您可以使用接收新活动中的信息

Intent intent = getIntent();
String someString = intent.getExtra("some string");

如果要在活动之间共享数据,可以使用intent或shared Preference。 使用这些tow和静态数据的区别在于,在某些静态数据中,intent和shared prefrence可以为空或null。但使用上述两种方法发送数据可以保证您将在下一个活动中获得数据,除非您强制删除首选项
您可以参考此链接了解更多信息

如果要在活动之间共享数据,您可以使用intent或shared Preference。 使用这些tow和静态数据的区别在于,在某些静态数据中,intent和shared prefrence可以为空或null。但使用上述两种方法发送数据可以保证您将在下一个活动中获得数据,除非您强制删除首选项
您可以参考此链接了解更多信息

android中有一种称为应用程序类的东西。它就像一个全球性的单身汉

  • 换句话说,该应用程序类对于整个应用程序是通用的
  • 应用程序类将是第一个要加载的类
因此,在应用程序类中存储一些随机使用的值会更容易

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>

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

android中有一种称为应用程序类的东西。它就像一个全球性的单身汉

  • 换句话说,该应用程序类对于整个应用程序是通用的
  • 应用程序类将是第一个要加载的类
因此,在应用程序类中存储一些随机使用的值会更容易

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>

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

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

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

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

如果类实例是可序列化的,则可以在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类都实现了可序列化,使您自己的类也可序列化非常简单。

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

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

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

如果类实例是可序列化的,则可以在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类都实现了可序列化,让自己的类也可序列化非常简单。

好吧,这种方式在Android中并不总是有效。您的静态值仅在应用程序运行时保持不变。假设您正在使用action SEND共享一些内容,因此您正在启动另一个应用程序,该应用程序实际上共享您的内容(Facebook、电子邮件等)。如果没有足够的资源启动其他应用程序,Android可能会决定完全停止您的应用程序。在这一点上,你的应用程序的过程完全消失了,你的静态值也随之消失。从共享内容的应用程序返回应用程序时,您已失去价值观

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

如果在设备中启用“开发人员选项”下的“不保留活动”选项,则可以轻松地进行尝试