You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问题:使用putExtra时始终发送首次输入的数据该如何解决?

嘿,我之前也碰到过一模一样的坑!每次调用putExtra都传首次输入的数据,大概率是接收数据的逻辑没踩对时机,或者Activity启动模式在搞鬼。咱们一步步来捋清楚:

首先,先修正你代码里的一个小bug

看你sendData里的这段代码:

String number = Integer.parseInt(Bookpage.getText().toString());

Integer.parseInt()返回的是int类型,直接赋值给String变量会编译报错的!如果要传数字类型,改成这样:

// 存int类型,接收时用getIntExtra
int number = Integer.parseInt(Bookpage.getText().toString());
back.putExtra("number", number);

如果就想传字符串,直接拿控件文本就行:

String number = Bookpage.getText().toString();
back.putExtra("number", number);
核心问题排查:MainActivity接收数据的时机不对

你是从子Activity返回传数据给MainActivity,这时候MainActivity如果已经在后台运行,不会重新走onCreate,所以如果你的数据接收逻辑只写在onCreate里,自然只能拿到第一次的数据。

情况1:用的是传统的startActivityForResult

确保MainActivity在onActivityResult里处理返回数据,而不是只在onCreate初始化一次:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 替换成你自己的请求码
    if (requestCode == 1001 && resultCode == RESULT_OK && data != null) {
        String bookName = data.getStringExtra("Bookname");
        String bookNote = data.getStringExtra("Booknote");
        int number = data.getIntExtra("number", 0); // 第二个参数是默认值
        
        // 这里更新UI或者处理最新数据,比如显示到TextView里
        tvBookName.setText(bookName);
    }
}

情况2:用的是AndroidX的Activity Result API

如果是用registerForActivityResult启动子Activity,要确保回调里每次都读取最新的Intent数据,不要缓存旧值:

ActivityResultLauncher<Intent> launcher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == RESULT_OK && result.getData() != null) {
            Intent data = result.getData();
            String bookName = data.getStringExtra("Bookname");
            // 处理最新数据
        }
    }
);

// 启动子Activity的代码
launcher.launch(new Intent(this, YourSubActivity.class));

情况3:MainActivity用了特殊启动模式

如果你的MainActivity在AndroidManifest.xml里设置了launchMode="singleTop"/singleTask/singleInstance,系统会复用已有的Activity实例,这时候新的Intent会传到onNewIntent方法里,你需要在这里处理:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // 把当前Intent替换成新的,避免后续getIntent()拿到旧数据
    setIntent(intent);
    // 调用统一的处理方法
    handleReceivedData(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 第一次启动时处理数据
    handleReceivedData(getIntent());
}

private void handleReceivedData(Intent intent) {
    if (intent != null) {
        String bookName = intent.getStringExtra("Bookname");
        // 处理数据
    }
}
最后验证一下数据是否正确传递

在sendData里加个日志,确认每次获取的控件文本都是最新的:

public void sendData(){
    String name = Bookname.getText().toString();
    int number = Integer.parseInt(Bookpage.getText().toString());
    String description = Booknote.getText().toString();
    
    // 打印日志看数据是不是最新的
    Log.d("SendDataDebug", "Name: " + name + ", Number: " + number + ", Desc: " + description);
    
    Intent back = new Intent(getApplicationContext(),MainActivity.class);
    back.putExtra("Bookname",name);
    back.putExtra("Booknote",description);
    back.putExtra("number",number);
    setResult(RESULT_OK, back);
    finish();
}

内容的提问来源于stack exchange,提问作者Skeptic94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:23:44