Android Studio中如何让动画仅在应用启动或重启时运行
解决动画仅在应用首次启动/重启时运行的问题
问题根源
你遇到的重复动画问题,核心原因是Activity2的返回逻辑错误:在back()方法中,你先finish()当前Activity,又调用startActivity()重新启动MainActivity,这会创建一个新的MainActivity实例,导致onCreate()再次执行,而成员变量isFirstTime在新实例中会被重新初始化为true,所以动画再次运行。
另外,即使修复返回逻辑,仅用成员变量isFirstTime也不可靠——当应用被系统回收后重启、或设备旋转导致Activity重建时,该变量会重置,动画会再次触发。
解决方案
1. 修复Activity2的返回逻辑
不需要重新启动MainActivity,直接finish()当前Activity即可回到栈中已存在的MainActivity实例:
public class MainActivity2 extends AppCompatActivity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); button = findViewById(R.id.back); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { back(); } }); } @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(0, 0); } public void back(){ // 直接finish当前Activity,回到之前的MainActivity finish(); overridePendingTransition(0, 0); } }
2. 用持久化标记控制动画仅首次运行
使用SharedPreferences存储首次启动标记,确保动画仅在应用安装后首次打开、或应用被彻底杀死重启时运行:
public class MainActivity extends AppCompatActivity { TextView view; Button button; SharedPreferences sharedPreferences; private static final String FIRST_LAUNCH_KEY = "first_launch"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); view = findViewById(R.id.text); button = findViewById(R.id.button); sharedPreferences = getSharedPreferences("app_prefs", MODE_PRIVATE); boolean isFirstLaunch = sharedPreferences.getBoolean(FIRST_LAUNCH_KEY, true); if (isFirstLaunch) { animation(); // 标记为已启动过 sharedPreferences.edit().putBoolean(FIRST_LAUNCH_KEY, false).apply(); } button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MainActivity2.class); startActivity(intent); } }); } public void animation(){ Animation animation = AnimationUtils.loadAnimation(this,R.anim.alpha); Animation animatio = AnimationUtils.loadAnimation(this,R.anim.alpha); view.startAnimation(animation); button.startAnimation(animatio); } }
额外说明
- 如果需要在用户清除应用数据后重新触发动画,
SharedPreferences的标记会被清除,正好符合需求。 - 若要支持“重启应用时再次触发动画”,可以在应用退出时清除标记,但通常不需要——除非有特定业务场景。
内容的提问来源于stack exchange,提问作者Noob tv
相关产品推荐
相关产品推荐

