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

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

有什么解决办法吗?


当前回答

有一些方法可以做到。 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后,获取数据。

其他回答

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

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

有一些方法可以做到。 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后,获取数据。

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

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

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

在第一个活动中,你可以使用startActivityForResult()发送意图,然后在它完成使用setResult后从第二个活动中获得结果。

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.class

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

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

但如果你不想完成第二个活动,想把数据发送回第一个活动,你可以使用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()中取消注册