Android启动时MainActivity的onCreate被两次调用该如何解决?
问题解决方案
该问题完全可解决,首先明确Android中Activity的onCreate被触发两次的常见原因多为配置变更导致的Activity销毁重建、启动模式异常导致多实例创建、ROM冷启动优化触发重建三类,具体处理方案如下:
通用兜底方案(覆盖所有触发场景)
利用Activity重建时onCreate的入参savedInstanceState不为空的特性,仅在首次创建Activity时执行跳转逻辑,重建时直接跳过业务逻辑即可,示例代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_title); Log.d("myname", "test"); // 仅首次创建时执行业务逻辑,重建场景直接跳过 if (savedInstanceState == null) { // 读取SharedPreferences判断首次启动、延时跳转逻辑都放在该分支内 boolean isFirstLaunch = getSharedPreferences("app_config", MODE_PRIVATE) .getBoolean("is_first_launch", true); // 提前标记首次启动状态已变更,避免极端场景下重复读写 getSharedPreferences("app_config", MODE_PRIVATE) .edit() .putBoolean("is_first_launch", false) .apply(); new Handler(Looper.getMainLooper()).postDelayed(() -> { Intent targetIntent = isFirstLaunch ? new Intent(this, GuideActivity.class) : new Intent(this, MainActivity.class); startActivity(targetIntent); // 跳转后立即关闭闪屏页,避免二次实例触发重复跳转 finish(); }, 2000); // 延时时长可按需调整 } }
针对性优化方案
- 拦截配置变更避免重建:在
AndroidManifest.xml中给闪屏页的Activity节点添加configChanges属性,避免常见配置变更触发Activity销毁重建:<activity android:name=".SplashActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> - 校验启动逻辑:排查是否存在多处调用闪屏页启动Intent的代码,避免重复触发启动请求。
内容的提问来源于stack exchange,提问作者Gytis Vejelis
相关产品推荐
相关产品推荐

