一、A => B

A.java

  1. public class A extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. // A 页面跳转 B 页面
  7. Intent intent = new Intent(A.this, B.class);
  8. startActivity(intent);
  9. }
  10. }

B.java

  1. public class B extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. }
  7. }

二、A => B,携带参数

A.java,传递参数

  1. public class A extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. // A 页面跳转 B 页面并携带参数
  7. Intent intent = new Intent(A.this, B.class);
  8. String dataStr = "Hello B";
  9. int dataNum = 100;
  10. intent.putExtra("str", dataStr);
  11. intent.putExtra("num", dataNum);
  12. startActivity(intent);
  13. }
  14. }

B.java,接收参数

  1. public class B extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. // 接收 A 传递过来的参数
  7. Intent intent = getIntent();
  8. String dataStr = intent.getStringExtra("str");
  9. int dataNum = intent.getIntExtra("num");
  10. }
  11. }

三、B => A,携带参数

B=>A 在做电商项目时遇到过这种情景:订单页面(A)要选择地址需要前往地址页面(B),在地址页面(B)选完地址后还要返回订单页面(B=>A),此时希望携带地址页面(B)选择的数据。

A.java

  1. public class A extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. // A 页面跳转 B 页面
  7. Intent intent = new Intent(A.this, B.class);
  8. startActivityForResult(intent, 1);
  9. }
  10. /**
  11. * B 活动销毁时会触发该方法,将参数传递过来
  12. */
  13. @Override
  14. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  15. switch (requestCode) {
  16. case 1: // 这里的 1 就是 onCreate 方法最后一行中的 1
  17. if (resultCode == RESULT_OK) {
  18. String returnedData = data.getStringExtra("str");
  19. Log.d(TAG, returnedData);
  20. }
  21. break;
  22. default:
  23. }
  24. }
  25. }

startActivityForResult() 也是用于启动活动,额外功能是在活动销毁时能够返回一个结果给上一个活动。

B.java

  1. public class B extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. // B 销毁时往 A 传递参数
  7. Intent intent = new Intent();
  8. intent.putExtra("data")
  9. String dataStr = intent.getStringExtra("str");
  10. int dataNum = intent.getIntExtra("str", "Hello World");
  11. setResult(RESULT_OK, intent);
  12. finish(); // B 活动销毁,会往 A 活动传递数据,触发A 活动中 onActivityResult() 方法
  13. }
  14. }

四、A => B,传参最佳实践

在第二点中介绍了 A 页面跳转到 B 页面并携带参数。B 页面需要几个参数应该由 B 决定,而不是 A 页面传了几个 B 就用几个。

A.java

  1. public class A extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. // A 页面跳转 B 页面,调用B的静态方法传递参数,传递参数个数与类型由B决定
  7. B.actionStart(A.this, "data1", "data2");
  8. }
  9. }

B.java

  1. public class B extends AppCompatActivity {
  2. @Override
  3. protected void onCreate (Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.first_layout);
  6. // 接收 A 传递过来的参数
  7. Intent intent = getIntent();
  8. String dataStr = intent.getStringExtra("str");
  9. int dataNum = intent.getIntExtra("num");
  10. }
  11. /**
  12. * 静态方法,处理 B 页面接收的参数
  13. */
  14. public static void actionStart (Context context, String data1, String data2) {
  15. Intent intent = new Intent(context, B.class);
  16. intent.putExtra("param1", data1);
  17. intent.putExtra("param2", data2);
  18. context.startActivity(intent);
  19. }
  20. }