繁体   English   中英

你如何在 Android 的活动之间来回传递数据?

[英]How do you pass data back and forth between activities in Android?

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

对于 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 来检索这些数据

您可以使用startActivityForResult来启动Activity2并接收返回给Activity1的结果

活动一

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");
        }
    }
}

活动二

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();
        });
    }
}

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM