You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android入门:如何创建共享Activity转场Intent的工具类?

你的Activity转场工具类实现分析与优化建议

一、现有实现的合理性

你写的静态工具类实现符合基础最佳实践:

  • 遵循了DRY(Don't Repeat Yourself)原则,把重复的Intent创建、Activity启动、转场动画逻辑抽离成公共方法,避免了在每个Activity中冗余编码;
  • 静态方法调用简洁,无需实例化工具类,使用成本低;
  • 核心逻辑正确,测试可用说明满足你的跳转需求。

不过还有几个优化点,能让代码更健壮、灵活,贴合Android开发的规范细节。

二、优化后的实现方案

1. 规范命名与空安全处理

调整类名、方法名增强语义,同时增加Activity状态判断,避免空指针或无效跳转:

public class ActivityTransitionUtils {
    // 基础带转场动画的跳转方法
    public static void startActivityWithTransition(Activity sourceActivity, Class<?> targetActivityClass) {
        // 校验Activity状态,避免已销毁/正在销毁的Activity执行跳转
        if (sourceActivity == null || sourceActivity.isFinishing() || sourceActivity.isDestroyed()) {
            return;
        }
        Intent intent = new Intent(sourceActivity, targetActivityClass);
        sourceActivity.startActivity(intent);
        sourceActivity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }
}

2. 支持传递跳转参数

实际开发中跳转常需要携带数据,增加重载方法支持自定义Intent:

public class ActivityTransitionUtils {
    // 基础跳转
    public static void startActivityWithTransition(Activity sourceActivity, Class<?> targetActivityClass) {
        startActivityWithTransition(sourceActivity, new Intent(sourceActivity, targetActivityClass));
    }

    // 支持携带参数的自定义Intent跳转
    public static void startActivityWithTransition(Activity sourceActivity, Intent intent) {
        if (sourceActivity == null || sourceActivity.isFinishing() || sourceActivity.isDestroyed()) {
            return;
        }
        sourceActivity.startActivity(intent);
        sourceActivity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }
}

3. 适配不同转场动画

把动画资源作为参数传入,让工具类支持多种转场效果:

// 支持自定义转场动画的跳转方法
public static void startActivityWithTransition(Activity sourceActivity, Class<?> targetActivityClass, int enterAnim, int exitAnim) {
    if (sourceActivity == null || sourceActivity.isFinishing() || sourceActivity.isDestroyed()) {
        return;
    }
    Intent intent = new Intent(sourceActivity, targetActivityClass);
    sourceActivity.startActivity(intent);
    sourceActivity.overridePendingTransition(enterAnim, exitAnim);
}

4. 调用示例

  • MainActivity跳转至AActivity:
// 基础跳转
ActivityTransitionUtils.startActivityWithTransition(this, AActivity.class);

// 带参数跳转
Intent intent = new Intent(this, AActivity.class);
intent.putExtra("KEY_DATA", "从Main页面传递的数据");
ActivityTransitionUtils.startActivityWithTransition(this, intent);
  • AActivity跳转至BActivity:
@Override
public void onClick(View v) {
    switch(v.getId()){
        case R.id.commBtn:
            // 业务逻辑处理...
            ActivityTransitionUtils.startActivityWithTransition(this, BActivity.class);
            break;
        case R.id.resBtn:
            // 业务逻辑处理...
            ActivityTransitionUtils.startActivityWithTransition(this, BActivity.class);
            break;
    }
}

三、额外最佳实践提示

  • 全局统一转场动画:如果App所有Activity跳转都使用相同动画,可直接在主题中配置,无需每次调用overridePendingTransition。在styles.xml中添加:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <!-- 其他主题配置 -->
    <item name="android:windowAnimationStyle">@style/GlobalActivityTransition</item>
</style>

<style name="GlobalActivityTransition">
    <item name="android:activityOpenEnterAnimation">@anim/fade_in</item>
    <item name="android:activityOpenExitAnimation">@anim/fade_out</item>
    <item name="android:activityCloseEnterAnimation">@anim/fade_in</item>
    <item name="android:activityCloseExitAnimation">@anim/fade_out</item>
</style>
  • 处理返回结果:若需从目标Activity获取返回数据,推荐使用AndroidX的ActivityResultContracts替代传统startActivityForResult,可结合工具类封装:
public static ActivityResultLauncher<Intent> registerActivityResultLauncher(Activity activity, ActivityResultCallback<ActivityResult> callback) {
    return activity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), callback);
}

调用示例:

// 注册结果回调
ActivityResultLauncher<Intent> resultLauncher = ActivityTransitionUtils.registerActivityResultLauncher(this, result -> {
    if (result.getResultCode() == RESULT_OK) {
        Intent data = result.getData();
        // 处理返回数据
    }
});

// 启动跳转
Intent intent = new Intent(this, BActivity.class);
resultLauncher.launch(intent);

内容的提问来源于stack exchange,提问作者JMStacky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:25:14