【问题标题】:Another way that you can exchange data between activities您可以在活动之间交换数据的另一种方式
【发布时间】:2013-11-15 14:15:10
【问题描述】:

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

我定义了这个类:

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

【问题讨论】:

    标签: java android eclipse


    【解决方案1】:

    通常使用意图内的附加功能在活动之间传递数据。此类数据在接收活动的整个生命周期内都会持续存在(完成后,垃圾收集器可以释放内存)。

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

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

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

    如果它是可序列化的,您可以在意图中传递一个类实例,例如:

    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,而且让你自己的类也可以序列化非常简单。

    【讨论】:

    • 但我怎样才能将 [calss] 或对象数据发送到其他活动?
    【解决方案2】:

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

    然后您可以使用

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

    【讨论】:

    • 你说得对,但我的问题在使用 putextra 和使用静态字段之间是不同的?
    • 如果您的应用崩溃或类似情况,使用NullPointerExceptions 会更安全
    【解决方案3】:

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

    【讨论】:

    • 我知道。我想知道你的解决方案和我的解决方案有什么不同?
    • 每个类都可以访问你的静态变量,但我的却不能。您还可以通过专门传递值来使用其他函数,例如 startActivityForResult()。
    【解决方案4】:

    您想在活动之间共享数据,您可以使用意图或共享偏好。 使用这些数据和静态数据的区别在于,意图和共享偏好,在某些静态数据可以为空或为空。但是使用以上两种方法发送数据保证您将在下一个活动中获取数据,除非您强行删除偏好 您可以参考此链接了解更多信息Static class in Java (Android) - use or not use

    【讨论】:

    • 但我可以通过“if”处理空值或空值。我也可以通过静态字段在活动之间发送对象!
    【解决方案5】:

    在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>
    

    【讨论】:

    • 为什么要使用应用程序?我想我不需要它。
    【解决方案6】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多