我的 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>
答案 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("");
}
}