簡體   English   中英

啟動另一個 Activity 時再次調用 Launch-Activity onCreate()

[英]Launch-Activity onCreate() called again when start another 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>

您是否對 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”活動標簽。

我已經找到了解決方案。 我在這里提出我的解決方案,以防有人遇到類似問題。

問題是我在 MainActivity 中調用了以下 function:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

這導致重新創建完整的活動堆棧(包括 InitActivity)。 InitActivity 的 savedInstanceState 是 null,我無法對此做出反應。

錯誤的程序流程如下:

應用程序以 InitActivity 啟動 -> 一些數據已初始化 -> InitActivity 啟動 MainAcitvity -> MainActivity 調用setDefaultNightMode導致 InitActivity 重新啟動但 savedInstanceState 為 null -> InitActivity 再次啟動 MainAcitvity

這沒有以無限循環結束的原因是 MainAcitvity 檢查夜間模式是否已正確設置,並且僅在需要更改設置時才調用setDefaultNightMode

我是如何解決的:

我將setDefaultNightMode移至 InitActivity。 這仍然會導致在 InitActivity 中再次調用onCreate ,但這次 savedInstanceState 不是 null ,我可以使用 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("");
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM