本文教你通过合理利用 Activity 生命周期(尤其是 onCreate() 与 onRestart() 的区别),配合标志位控制,确保欢迎动画只在应用冷启动或进程被系统杀死后重启时执行,避免从其他页面返回时重复触发。
本文教你通过合理利用 activity 生命周期(尤其是 `oncreate()` 与 `onrestart()` 的区别),配合标志位控制,确保欢迎动画只在应用冷启动或进程被系统杀死后重启时执行,避免从其他页面返回时重复触发。
在 Android 开发中,常见的误区是将初始化逻辑(如欢迎动画)全部堆砌在 onCreate() 中,并依赖简单布尔变量(如 isFirstTime)做一次性判断。然而,这种做法在 Activity 被 finish() 后又通过 startActivity() 重新创建时会失效——因为 startActivity() 会触发全新的实例生命周期,onCreate() 再次执行,导致动画重复播放。
根本原因在于:你当前的 back() 方法在 MainActivity2 中使用了错误的导航模式:
public void back(){
finish(); // ✅ 正确:结束当前 Activity
overridePendingTransition(0, 0);
startActivity(new Intent(MainActivity2.this, MainActivity.class)); // ❌ 错误:主动新建 MainActivity 实例!
}
这会导致 MainActivity 被重新创建(调用 onCreate()),而非恢复原有实例。正确做法是仅调用 finish(),让系统自动将栈顶的 MainActivity2 弹出,使后台的 MainActivity 进入 onRestart() → onStart() → onResume() 流程,从而跳过 onCreate(),避免动画重播。
✅ 正确的 back() 实现如下:
public void back() {
finish(); // 仅结束当前 Activity,不主动启动新实例
}
同时,为精准区分“首次创建”与“后台恢复”,推荐使用 savedInstanceState == null 作为冷启动判定依据(比手动维护 isFirstTime 更可靠,且能兼容系统因内存压力杀进程后的重建场景):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = findViewById(R.id.text);
button = findViewById(R.id.button);
// ✅ 只有在 Activity 全新创建(非配置变更/进程恢复)时才播放动画
if (savedInstanceState == null) {
animation();
}
button.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent);
});
}
public void animation() {
Animation alphaIn = AnimationUtils.loadAnimation(this, R.anim.alpha);
view.startAnimation(alphaIn);
Animation buttonAnim = AnimationUtils.loadAnimation(this, R.anim.alpha);
button.startAnimation(buttonAnim);
}
⚠️ 注意事项:
- 不要重写 onBackPressed() 并手动 startActivity() —— 这破坏了标准任务栈行为;
- 避免在 onResume() 中播放动画,除非你明确需要每次可见都触发(如轮播 Banner);
- 若需更严格的“仅 App 启动时”控制(例如多 Activity 场景),可结合 Application 类 + 进程标记,或使用 ProcessLifecycleOwner 监听整个应用前后台状态;
- 动画资源(如 R.anim.alpha)建议设置 android:fillAfter="true" 或在动画结束后手动设置最终状态,防止视觉闪烁。
总结:欢迎动画的本质是“冷启动引导”,应绑定到 onCreate() 中 savedInstanceState == null 的判断上,并确保导航逻辑尊重 Android 任务栈机制——用 finish() 返回,而非 startActivity() 重建。这样既简洁可靠,又完全符合平台设计规范。










