【问题标题】:What is the right way to hold and restore the data temporarily between activities in android?在android中的活动之间临时保存和恢复数据的正确方法是什么?
【发布时间】:2017-01-18 16:33:28
【问题描述】:

我正在创建一个 Android 应用。其中一项功能是从用户那里收集一些数据(项目名称、项目 ID 和条形码字符串)。

Activity1 是一个表单。用户手动输入项目名称和项目编号。对于条形码字符串,用户单击“扫描”按钮,然后启动 Activity2(扫描仪)以扫描和读取条形码。读取条形码后,Activity1(表单)将再次启动,所有数据都应显示在表单上。

当Activity2被Intent启动时,Activity1被杀死。所以,我必须在盯着 Intent 之前获取项目名称和项目编号并临时存储它们。然后当 Activity1 再次启动时,这些数据将再次呈现在表单上。

现在我正在考虑使用 Intent Extra 来保留项目名称和编号,并将它们传递给 Activity2 并返回给 Activity1。鉴于 Activity2 不需要这些数据,我想知道在这种情况下这是否是正确的方法。有没有更好的办法?我应该改用共享首选项吗?

【问题讨论】:

  • 当 Activity2 由 Intent 启动时,Activity1 被杀死。 仅当您明确销毁它时。是这样吗?如果有,为什么?
  • @MLAC 关于这个问题:您不必担心。第一个活动永远不会被杀死。您可以使用正常的保存/恢复实例状态机制来保留您需要的信息(如果您不知道我在做什么,请使用 Google“恢复实例状态”)。
  • 我现在遇到的问题是,当我使用意图从 Activity1 转到 Activity2 时,Activity1 和表单上的数据都消失了。因此,当我再次启动 Activity1 时,会在没有先前数据的情况下创建活动。所以我必须在启动Activity2之前保存数据。
  • 你如何从Activity2返回Activity1?它不应该“重新开始”,它应该只是恢复。在这种情况下,表单中的所有数据应该仍然存在。请将您的清单添加到您的帖子中。
  • 另外,如果Activity2 不需要您在Activity1 中收集的数据,则没有理由将此数据传递给Activity2

标签: android android-intent android-sharedpreferences


【解决方案1】:

在您的第一个活动中,使用 put extra 参数来表示这样的意图:

// Assuming Activity2.class is second activity
Intent intent = new Intent(this, Activity2.class); 
intent.putExtra("variable_name", var); // here you are passing var to second activity
startActivity(intent);

然后在第二个活动中检索这样的参数:

String var2 = getIntent().getStringExtra(variable_name);

【讨论】:

  • 这就是我现在正在做的事情:使用 Intent Extra(即 .putExtra)来携带数据。还是我应该使用“共享首选项”将数据暂时保存在本地文件中?我想知道共享首选项是否会是更好的方法。对于共享首选项,本地存储需要通过...
  • 使用 putExtra 您只能存储一个周期的数据,即当您退出应用程序时,您存储的数据将丢失。但是在共享首选项的情况下,您甚至可以在退出应用程序并再次打开应用程序后重新获取数据。当需要存储少量数据时,使用 Shared Preferences 代替 SQLite。
  • 在您的用例中,我建议使用共享首选项。
  • 在您的用例中,如果即使在应用程序退出后仍需要保留数据,那么共享首选项是一个不错的选择。如果在应用程序退出后不需要存储数据,那么 putExtra 更好,因为它更快且优化。
【解决方案2】:

您可以创建一个单例类并为模型对象(这里是两个私有字符串变量)公开 setter(用于保存)和 getter(用于检索)方法。此类将在您的应用程序中有效:

public class MyClass{
private static MyClass instance=null;
public static getInstance(){
if(instance==null){
instance=new MyClass();
}
return instance;
}


private String itemName;
private String itemNumber;
//setter and getter methods here  
}

【讨论】:

    【解决方案3】:

    为什么要杀死Activity 1,尝试调用

    关于活动 1

    声明private int SCAN_BARCODE_REQUEST = 101;

    然后

     //finish();  dont use this to destroy activity 1
     startActivityForResult(new intent(this,Activity2.class), SCAN_BARCODE_REQUEST);
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        if (requestCode == SCAN_BARCODE_REQUEST) {
    
            if (resultCode == RESULT_OK) {
                String barcode = data.getStringExtra("BARCODE");
    
                 //handle your barcode string here
            }
        }
    }
    

    在您的活动 2 中, 更改您的开始 Activity1 与

    Intent intent = new Intent();
    intent.putExtra("BARCODE", barcodeString);
    setResult(RESULT_OK, intent);
    finish(); 
    

    【讨论】:

      【解决方案4】:

      您可以使用SharedPreferences。 您可以在此处了解如何使用它们: https://www.tutorialspoint.com/android/android_shared_preferences.htm https://developer.android.com/training/basics/data-storage/shared-preferences.html

      SharedPreferences 对于此类应用程序来说是一个非常好的解决方案。它非常简单,易于使用和实现。

      【讨论】:

      • 他知道他可以使用共享首选项。你为什么会推荐它?为什么不在意图中发回数据并使用活动结果?
      • 创建这么多变量会是不必要的内存浪费,因为他想回到Activity1重新加载数据。这将需要 2 个意图。将数据从 Activity1 发送到 Activity2,将另一个数据从 Activity2 发送到 Activity1。它将创建必要的线程并浪费内存。 SharedPreferences 在机器上更容易、更轻。
      • 您认为写入/读取存储在磁盘文件中的共享首选项比向意图添加数据字段更快?
      • 我正在尝试找出哪个更好:1. 使用“Intent Extra”来携带数据,或者 2.使用“Shared Preferences”将数据保存在本地文件中。 ..我现在使用“1”,我想知道“2”是否会更好。对于“1”,不需要本地存储...
      • @MLAC sharedpreferences 绝对不是这种情况下的最佳解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2020-08-11
      相关资源
      最近更新 更多