父传子 (MainActivity -> SonActivity)
方式:
首先应该实例化Intent对象,new Intent实例,并且可以通过Intent.putExtra来放置数据
最后通过startActivity(intent)发送Intent实例。
案例:
先在 SonActivity 中定义一个常量和方法
public class CheatActivity extends AppCompatActivity {
// 命名规范: 父的完整名称.自定义
private static final String EXTRA_ANSWER_IS_TRUE = "com.example.geoquiz.MainActivity.answer_is_true";
protected void onCreate(Bundle savedInstanceState) {
...
}
// 这个定义为公共静态方法可以供 MainActivity调用
public static Intent newIntent(Activity ac, boolean answerIsTrue) {
Intent intent = new Intent(ac, CheatActivity.class);
// 设置键值对
intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);
return intent;
}
}
在 activity_main.xml 中定义一个按钮,设置id为 son_button
然后对按钮设置监听事件,在onCreate方法中:
mCheatButton = findViewById(R.id.son_button);
// lambda
mCheatButton.setOnClickListener(view -> {
boolean answerIsTrue = true;
// 这里调用到了 SonActivity中的静态方法 newIntent
Intent intent = SonActivity.newIntent(MainActivity.this, answerIsTrue);
startActivity(intent);
});
如此 SonActivity 就能获得父activity传过来的 answerIsTrue
在 SonActivity 中的onCreate方法中打印:
// Activity.getIntent()方法返回了由startActivity(Intent)方法转发的 Intent对象
// 第一个参数为键,第二个参数为设置默认值
boolean a = this.getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false); //true
子传父 (SonActivity -> MainActivity)
方式:
如果需要从子activity获取返回信息,父activity需要调用
public void startActivityForResult(Intent intent, int requestCode) 而不是 startActivity
如果需要子activity发送返回信息给父activity,就调用:
public final void setResult(int resultCode)
public final void setResult(int resultCode, Intent data)
resultCode可以是以下任意一个预定义常量:
Activity.RESULT_OK
Activity.RESULT_CANCELED
RESULT_FIRST_USER(如需自己定义结果代码,可使用这个)如果父使用 startActivityForResult(...) 调用子,resultCode总会返回给父
子没有调用setResult(...)方法的情况下,如果用户按了后退按钮,父activity则会收到Activity.RESULT_CANCELED的结果代码
如果用户做了后退操作 操作系统自动调用父activity的以下方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
参数解释:父的请求代码,子setResult方法中的两个参数resultCode和intent