android 里 activity 的跳转常用方式

管理用户界面和交互。Activity 之间的跳转是常见的需求

在 Android 开发中,Activity 是应用的核心组件之一,用于管理用户界面和交互。Activity 之间的跳转是常见的需求,以下是几种常用的 Activity 跳转方式及其使用场景:


1. 使用 Intent 进行显式跳转

显式跳转是指明确指定目标 Activity 的类名,适用于在同一应用内跳转。

示例代码:

Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivity(intent);

特点:

  • 直接指定目标 Activity。
  • 适合应用内部的页面跳转。
  • 简单直观,开发中最常用的方式。

2. 使用 Intent 进行隐式跳转

隐式跳转通过定义 Action、Category 或 Data 来匹配目标 Activity,适用于跨应用跳转或不确定目标 Activity 的场景。

示例代码:

Intent intent = new Intent();
intent.setAction("com.example.ACTION_TARGET");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

AndroidManifest.xml 中配置目标 Activity:

<activity android:name=".TargetActivity">
    <intent-filter>
        <action android:name="com.example.ACTION_TARGET" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

特点:

  • 不直接指定目标 Activity,而是通过 Intent Filter 匹配。
  • 适合跨应用调用(如打开浏览器、拨号等)。
  • 需要确保目标 Activity 的 Intent Filter 配置正确。

3. 带参数跳转

通过 Intent 传递数据到目标 Activity。

示例代码:

Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
intent.putExtra("key", "value"); // 传递字符串
intent.putExtra("number", 123);  // 传递整数
startActivity(intent);

在目标 Activity 中获取参数:

Intent intent = getIntent();
String value = intent.getStringExtra("key");
int number = intent.getIntExtra("number", 0); // 第二个参数为默认值

特点:

  • 可以传递基本数据类型、序列化对象(如 SerializableParcelable)。
  • 适合需要携带数据的跳转场景。

4. 启动 Activity 并获取返回结果

通过 startActivityForResult 启动目标 Activity,并接收返回结果。

示例代码(旧版 API):

// 启动目标 Activity
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivityForResult(intent, REQUEST_CODE);

// 接收返回结果
@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");
    }
}

示例代码(新版 API - 使用 ActivityResultLauncher):

从 Android Jetpack 引入 ActivityResultContracts 后,推荐使用 registerForActivityResult 替代 startActivityForResult

ActivityResultLauncher<Intent> launcher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == RESULT_OK) {
            Intent data = result.getData();
            String resultValue = data.getStringExtra("result_key");
        }
    }
);

// 启动目标 Activity
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
launcher.launch(intent);

特点:

  • 适合需要从目标 Activity 返回数据的场景。
  • 新版 API 更加简洁且避免了回调地狱。

5. 使用 PendingIntent 跳转

PendingIntent 是一种特殊的 Intent,通常用于通知栏点击事件或广播接收器中启动 Activity。

示例代码:

Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

// 示例:设置通知栏点击事件
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("标题")
    .setContentText("内容")
    .setSmallIcon(R.drawable.ic_notification)
    .setContentIntent(pendingIntent)
    .setAutoCancel(true);

NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(1, builder.build());

特点:

  • 适合异步场景,如通知栏、Widget 或 AlarmManager。
  • 提供延迟执行的能力。

6. 使用 TaskStackBuilder 构建任务栈

当需要启动一个带有返回栈的 Activity 时,可以使用 TaskStackBuilder

示例代码:

Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
stackBuilder.startActivities();

特点:

  • 适合需要构建复杂返回栈的场景。
  • 常用于深度链接或通知栏跳转。

7. 使用 Fragment 模拟 Activity 跳转

虽然这不是真正的 Activity 跳转,但在某些情况下,可以通过 Fragment 切换来模拟页面切换效果。

示例代码:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, new TargetFragment());
transaction.addToBackStack(null); // 添加到返回栈
transaction.commit();

特点:

  • 适合轻量级页面切换。
  • 减少 Activity 的创建开销。

总结

以上是 Android 中 Activity 跳转的常用方式,选择哪种方式取决于具体的需求:
- 显式跳转:简单直接,适合应用内跳转。
- 隐式跳转:灵活,适合跨应用调用。
- 带参数跳转:适合需要传递数据的场景。
- 返回结果:适合需要从目标页面获取数据的场景。
- PendingIntent:适合异步场景。
- TaskStackBuilder:适合复杂的返回栈需求。
- Fragment 切换:适合轻量级页面切换。

根据实际业务需求选择合适的跳转方式,能够提升代码的可读性和用户体验。