Android 跳转MainActivity时InitActivity的onCreate方法重复触发问题
问题根因
你遇到的InitActivity onCreate重复调用、MainActivity启动两次的问题,90%以上是以下三个场景触发的:
- 配置变更(横竖屏切换、系统字体大小/分辨率调整等)导致InitActivity被系统销毁重建,原有异步初始化任务完成后启动一次MainActivity,重建后的新Activity又会触发一次新的初始化任务、二次启动MainActivity
- 应用首次安装后从系统安装弹窗直接点击「打开」启动,之后切后台再点击桌面图标启动,Android系统的原生任务栈管理bug会导致启动页被重复创建到栈顶
- 你使用
FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK标记启动MainActivity时,如果当前应用进程被系统临时回收过,重建任务栈时会优先创建栈底的InitActivity,再跳转到MainActivity,也会触发InitActivity onCreate二次调用
解决方案
按优先级依次做以下修改即可解决:
- 先解决系统原生的安装后启动重复问题,在InitActivity的onCreate最开头加入栈根判断:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 不是任务栈根节点直接销毁,避免重复创建 if (!isTaskRoot()) { finish(); return; } setContentView(R.layout.activity_init); // 后续原有逻辑 }
- 给InitActivity添加配置变更拦截,避免普通配置变更导致Activity销毁重建,修改Manifest中InitActivity的配置:
<activity android:name=".Ui.InitActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustPan" android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize|screenLayout|uiMode"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
- 增加初始化标记位,即使Activity被重建也不会重复执行初始化逻辑,修改InitActivity代码:
public class InitActivity extends AppCompatActivity { private boolean hasInitStarted = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!isTaskRoot()) { finish(); return; } setContentView(R.layout.activity_init); // 已经启动过初始化直接返回 if (hasInitStarted || savedInstanceState != null) { return; } hasInitStarted = true; DatabaseInitTask databaseInitTask = new DatabaseInitTask(getApplicationContext(), new DatabaseInitTask.DatabaseInitCallback() { @Override public void onInitCompleted() { showMainActivity(); // 启动完直接销毁当前页,避免留在栈中 finish(); } }); databaseInitTask.execute(""); } private void showMainActivity() { Intent intent = new Intent(this, MainActivity.class); // 如果不需要清除整个任务栈,可直接去掉这两个FLAG,启动后finish当前页即可 // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } }
内容的提问来源于stack exchange,提问作者OPunktSchmidt
相关产品推荐
相关产品推荐

