Android activity之间的数据传递

428 阅读1分钟

父传子 (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