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

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

有什么解决办法吗?


当前回答

所有这些答案都是在解释你发送数据后需要完成的第二个活动的场景。

但如果你不想完成第二个活动,想把数据发送回第一个活动,你可以使用BroadCastReceiver。

〇第二次活动

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

〇第一次活动

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

在onCreate()-中注册接收者

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

在onDestroy()中取消注册

其他回答

使用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);

所有这些答案都是在解释你发送数据后需要完成的第二个活动的场景。

但如果你不想完成第二个活动,想把数据发送回第一个活动,你可以使用BroadCastReceiver。

〇第二次活动

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

〇第一次活动

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

在onCreate()-中注册接收者

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

在onDestroy()中取消注册

FirstActivity使用startActivityForResult:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

在SecondActivity上调用setResult() onClick事件或onBackPressed()

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);

使用startActivityForResult()方法调用子活动Intent

这里有一个例子: http://developer.android.com/training/notepad/notepad-ex2.html

在“从屏幕返回结果”中: http://developer.android.com/guide/faq/commontasks.html#opennewscreen

只是一个小细节,我认为是错过了以上的答案。

如果你的子活动可以从多个父活动中打开,那么你可以根据你的活动是由startActivity还是startActivityForResult打开来检查你是否需要做setResult。您可以通过使用getCallingActivity()来实现这一点。更多信息请点击这里。