在Java(特别是Android开发)中,两个界面(Activity)的跳转主要通过Intent实现,以下是详细步骤和代码示例,符合开发规范并兼顾最佳实践:
核心概念
- Activity
Android应用的每个界面都是一个Activity
,需在AndroidManifest.xml
中注册。 - Intent
用于组件间通信的对象,分为显式Intent(指定目标类)和隐式Intent(指定动作)。
显式跳转(最常用)
场景:从MainActivity
跳转到SecondActivity
// 在 MainActivity.java 中 Button btnJump = findViewById(R.id.btn_jump); // 绑定按钮 btnJump.setOnClickListener(v -> { // 1. 创建显式Intent(指定目标Activity类) Intent intent = new Intent(MainActivity.this, SecondActivity.class); // 2. 传递数据(可选) intent.putExtra("key_username", "John"); // 字符串 intent.putExtra("key_age", 25); // 整型 // 3. 启动目标Activity startActivity(intent); });
在 SecondActivity 中接收数据
// 在 SecondActivity.java 的 onCreate() 方法中 Intent intent = getIntent(); String username = intent.getStringExtra("key_username"); // 接收字符串 int age = intent.getIntExtra("key_age", 0); // 接收整型(0为默认值)
返回数据到上一个界面
步骤1:从 MainActivity 启动 SecondActivity 并等待结果
// MainActivity.java private static final int REQUEST_CODE = 1; // 唯一请求标识 btnJump.setOnClickListener(v -> { Intent intent = new Intent(this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE); // 使用旧API(兼容性高) // 或使用 registerForActivityResult()(推荐新API,此处省略) });
步骤2:在 SecondActivity 中设置返回数据
// SecondActivity.java Button btnBack = findViewById(R.id.btn_back); btnBack.setOnClickListener(v -> { Intent resultIntent = new Intent(); resultIntent.putExtra("result_key", "Data from SecondActivity"); setResult(RESULT_OK, resultIntent); // RESULT_OK 表示操作成功 finish(); // 关闭当前Activity });
步骤3:在 MainActivity 接收返回数据
// MainActivity.java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result_key"); Toast.makeText(this, "返回数据: " + result, Toast.LENGTH_SHORT).show(); } }
隐式跳转(跨应用通信)
// 跳转到系统拨号界面 Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:123456")); startActivity(intent);
关键注意事项
- 注册Activity
在AndroidManifest.xml
中添加:<activity android:name=".SecondActivity" />
- 数据传递限制
避免传递大对象(如Bitmap),优先用Parcelable
或Serializable
接口传递轻量数据。 - 新API推荐
使用Activity Result API
替代startActivityForResult()
(AndroidX库):// 依赖:implementation "androidx.activity:activity:1.2.0" ActivityResultLauncher<Intent> launcher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); // 处理返回数据 } }); // 启动:launcher.launch(new Intent(...));
- 常见错误
- 未注册Activity导致
ActivityNotFoundException
。 - 错误使用
Intent
键名导致数据获取失败(键名需一致)。
- 未注册Activity导致
最佳实践
- 安全性:避免使用隐式Intent跳转敏感界面(需验证目标Activity是否存在)。
- 性能:用
Bundle
传递数据代替全局变量。 - 代码解耦:使用路由框架(如ARouter)管理复杂跳转逻辑。
引用说明参考Android官方文档《启动另一个Activity》及《ActivityResult API》,遵循Material Design交互规范。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/46381.html