[英]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.