我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。

现在我想把一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它会抛出一些运行时异常。

有什么解决办法吗?


当前回答

2021年3月更新

在Activity v1.2.0和Fragment v1.3.0中,引入了新的活动结果api。

Activity Result api提供了用于注册结果、启动结果以及在系统分派结果后处理结果的组件。

因此不再需要使用startActivityForResult和onActivityResult。

为了使用新的API,你需要在你的源Activity中创建一个ActivityResultLauncher,指定当目标Activity完成并返回所需数据时将运行的回调:

private val intentLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

        if (result.resultCode == Activity.RESULT_OK) {
            result.data?.getStringExtra("key1")
            result.data?.getStringExtra("key2")
            result.data?.getStringExtra("key3")
        }
    }

然后,在你需要的时候启动你的intent:

intentLauncher.launch(Intent(this, YourActivity::class.java))

为了从目标Activity中返回数据,你只需要添加一个返回setResult()方法的值的意图:

val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")

setResult(Activity.RESULT_OK, data)
finish()

如需更多信息,请参考Android文档

其他回答

另一种实现预期结果的方法(根据您的情况可能更好)是创建侦听器接口。

通过使父活动侦听由子活动触发的接口,同时将所需的数据作为参数传递,可以创建类似的环境集

使用sharedPreferences并保存数据并从应用程序中的任何地方访问它

像这样保存日期

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

然后像这样接收数据

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);

Activity 1使用startActivityForResult:

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

启动Activity 2,你可以执行以下操作,关闭Activity:

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

Activity 1 -从前一个Activity返回将调用onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

更新: 回答Seenu69的评论,在活动二,

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

在活动一中,

int result = data.getExtra(KEY_RESULT);

根据具体情况,有几种方法可以达到你想要的效果。

最常见的场景(听起来就是你的场景)是使用子活动获取用户输入——比如从列表中选择联系人或在对话框中输入数据。在这种情况下,你应该使用startActivityForResult来启动你的子Activity。

这提供了一个使用setResult将数据发送回主Activity的管道。setResult方法接受一个int结果值和一个Intent,该Intent被传递回调用Activity。

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

要访问调用Activity中返回的数据,重写onActivityResult。requestCode对应于startActivityForResult调用中传递的整数,而resultCode和data Intent则从子Activity返回。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}

有一些方法可以做到。 1. 使用startActivityForResult(),这在上面的答案中有很好的解释。

通过在你的“Utils”类或你自己的任何其他类中创建静态变量。例如,我想将studententid从ActivityB传递到ActivityA。首先,我的ActivityA调用ActivityB。然后在ActivityB中设置studententid(这是Utils.class中的一个静态字段)。 Utils.STUDENT_ID="1234";然后当回到ActivityA时,使用存储在Utils.STUDENT_ID中的studententid。 通过在应用程序类中创建getter和setter方法。

是这样的:

public class MyApplication extends Application {

    private static MyApplication instance = null;
    private String studentId="";

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public void setStudentId(String studentID){
        this.studentId=studentID;
    }

    public String getStudentId(){
        return this.studentId;
    }
}

这样就做完了。当你在ActivityB时,在里面设置数据,回到ActivityA后,获取数据。