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
相关产品推荐
相关产品推荐

