启动另一个活动时再次调用启动活动 onCreate()

时间:2021-05-11 13:25:44

标签: java android android-activity

我的 Android 应用程序通过一个简单的 Activity 启动,并显示一个 ProgressBar。初始化一些数据,然后加载 MainActivity 供用户交互。

问题:

当 showMainActivity() 中的 startActivity() 被调用时, InitActivity 中的 onCreate() - 方法被再次调用。这会导致再次初始化数据并启动 MainActivity 两次。奇怪的是,这并没有以无限循环结束,而是只发生一次。

有谁知道为什么 startActivity() 会导致 InitActivity 的 onCreate() 再次被调用?

代码:

public class InitActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

//GETS CALLED AGAIN AFTER showMainActivity()

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_init);

    DatabaseInitTask databaseInitTask = new DatabaseInitTask(getApplicationContext(), new DatabaseInitTask.DatabaseInitCallback() {
        @Override
        public void onInitCompleted() {

                    showMainActivity();
            });
        }
    });

    databaseInitTask.execute("");
}

private void showMainActivity() {
    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
}
}

清单:

   <activity
        android:name=".Ui.MainActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data
                android:host="mydomain.com"
                android:scheme="https"/>
        </intent-filter>
    </activity>
    <activity
        android:name=".Ui.InitActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

2 个答案:

答案 0 :(得分:0)

您是否对 AndroidManifest 文件进行了更改?如果没有,试试这个

        <activity android:name="com.android.example.sleepcodelab.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

从“MainActivity”活动标签中剪切意图过滤器部分并将其粘贴到“InitActivity”活动标签中。

答案 1 :(得分:0)

我已经找到了解决方案。我在这里介绍我的解决方案,以防有人遇到类似问题。

问题是我在 MainActivity 中调用了以下函数:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

这会导致重新创建完整的活动堆栈(包括 InitActivity)。 InitActivity 的 savedInstanceState 为空,我无法对此做出反应。

错误的程序流程如下:

App 以 InitActivity 启动 -> 一些数据被初始化 -> InitActivity 启动 MainAcitvity -> MainActivity 调用 setDefaultNightMode 导致 InitActivity 重新启动但 savedInstanceState 为 null -> InitActivity 再次启动 MainAcitvity

之所以没有以无限循环结束,是因为 MainAcitvity 检查了夜间模式是否已正确设置并仅在需要更改设置时才调用 setDefaultNightMode

我是如何解决的:

我将 setDefaultNightMode 移至 InitActivity。这仍然会导致 onCreate 在 InitActivity 中被第二次调用,但这次savedInstanceState 不为空,我可以使用savedInstanceState 来防止MainActivity 被第二次启动。

我不完全理解为什么 savedInstanceState 不再为 null 但它现在可以工作了。

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_init);

    if(savedInstanceState == null) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    } else
    {
    DatabaseInitTask databaseInitTask = new DatabaseInitTask(getApplicationContext(), new DatabaseInitTask.DatabaseInitCallback() {
        @Override
        public void onInitCompleted() {

                    showMainActivity();
                }
            });
        }
    });

    databaseInitTask.execute("");
  }
}
相关问题