【问题标题】:How do you pass data back and forth between activities in Android?如何在 Android 中的活动之间来回传递数据?
【发布时间】:2020-10-19 21:04:04
【问题描述】:

我有两个活动应该使用意图来回传递数据。我不确定在哪里放置一些 put 和 get。

对于 Activity1 (MainActivity),我有一个按钮,按下它会创建一个意图,然后将其放入 Activity2,然后使用 startActivity(intent) 启动它。

btn.setOnClickListener((v) -> {
    Intent intent = new Intent(this, Activity2.class);
    intent.putExtra("test", testClass);
    startActivity(intent);
});

然后在 Activity2 中,我使用 getIntent 在 onCreate() 函数中获取该信息。

现在我想做的是在 Activity2 中有一个按钮,它将数据传递给 Activity1,但不一定“启动/显示”活动。

所以我想知道如何做到这一点。

我的想法是与以前类似:

活动2:

btn.setOnClickListener((v) -> {
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("info", info);
});

但我对两件事感到困惑

  1. 我可以在不立即开始活动的情况下执行此操作吗
  2. 我应该在 MainActivity 中的哪里调用 getIntent 来检索这些数据

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    您可以使用startActivityForResult 启动Activity2 并将结果返回给Activity1

    活动 1

    int LAUNCH_ACTIVITY_TWO = 1;
    Intent i = new Intent(this, Activity2.class);
    i.putExtra("test", testClass);
    startActivityForResult(i, LAUNCH_ACTIVITY_TWO);
    
    //onActivityResult
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == LAUNCH_ACTIVITY_TWO) {
            if(resultCode == Activity.RESULT_OK){
                String result=data.getStringExtra("result");
            }
        }
    }
    

    活动 2

    Intent returnIntent = new Intent();
    returnIntent.putExtra("result", result);
    setResult(Activity.RESULT_OK, returnIntent);
    finish();
    

    完整活动 1 代码:

     public class MainActivity extends AppCompatActivity {
        public static int LAUNCH_ACTIVITY_TWO = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btn = (Button) findViewById(R.id.btn);
    
            btn.setOnClickListener((v) -> {
                Intent i = new Intent(this, Activity2.class);
                i.putExtra("test", testClass);
                startActivityForResult(i, LAUNCH_ACTIVITY_TWO);
            });
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == LAUNCH_ACTIVITY_TWO) {
                if(resultCode == Activity.RESULT_OK){
                    String result= data.getStringExtra("result");
                }
            }
        }
    }
    

    完整活动 2 代码:

    public class Activity2 extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            if(getIntent().getExtras() != null) {
                // Get intent extras from Activity 1
            }
            
            Button btn = (Button) findViewById(R.id.btn);
    
            btn.setOnClickListener((v) -> {
                Intent returnIntent = new Intent();
                returnIntent.putExtra("result", result);
                setResult(Activity.RESULT_OK, returnIntent);
                finish();
            });
        }
    }
    

    【讨论】:

    • 谢谢!有没有办法做到这一点,但在传回数据后不启动 Activity 1?就像只是发回数据但等待用户自己点击返回?
    • 你到底想完成什么?
    • 这段代码究竟做了什么......除了我不希望用户在他们想要之前被带回活动1。我仍然希望将数据传递给activity1,而不是屏幕本身。这可能吗?
    • 您可以将结果数据存储在当前活动中,当用户决定退出时,您可以调用 putExtra 和 setResult
    • 酷,我所做的只是保持大部分相同的代码,除了我刚刚取出了 finish() 调用。我认为数据仍会传递回 Activity 1,但现在它不会自动导航到它
    【解决方案2】:

    例如,您可以在活动 2 中创建一个列表,向其中添加要传递给活动 1 的数据。在开始 activity1 之前,您从数组中获取值并将它们作为附加值添加到输入中。 您可以将数据添加到 JSONObject 并使用序列化程序,这样您就不必自己添加所有项目。

    如果您想将数据传递给activity1而不启动它,那么activity1会处理数据,这是不可能的。当您在 activity2 中时,Activity 不会执行任何操作,对于这种情况,您使用片段。

    如果您使用片段,您可以将所有数据放入绑定到活动而不是每个片段的视图模型中。

    【讨论】:

      【解决方案3】:

      有几种方法可以实现这一点,具体取决于您正在查看的数据类型。

      如果它是一个完整的类对象,则使该类可解析。您可以在此网站http://www.parcelabler.com/ 中复制和粘贴课程,它会自动为您格式化。你所要做的就是将它作为一个额外的意图传递。

      如果您正在查看需要对其执行操作然后传递给另一个活动的数据,我建议您使用意图服务。您可以在服务中接收到 Intent 之前执行某些操作。

      如果您希望仅在应用程序中发生 XYZ 后才执行某些操作,则使用共享首选项。这些可以很容易地在任何地方访问。

      最后,如果您一直在使用需要保持持久性的批量数据,请使用本地数据库存储并在需要时进行查询。

      【讨论】:

        【解决方案4】:

        您可以为此使用SharedPreferences 或静态变量/字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 1970-01-01
          • 2014-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多