【发布时间】:2021-05-11 13:25:44
【问题描述】:
我的 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>
【问题讨论】:
-
最简单的修复(不确定是否正确)是检查 savedInstanceState 包是否为空。如果它为空,则意味着正在创建一个新的活动实例。否则,将重新创建现有的活动实例。
-
似乎两次 onCreate() 都被称为 savedInstanceState 是 null :(
-
难以置信。你怎么知道会发生这种情况?
-
我通过 Logcat 记录了这个。并且 onCreate() 被调用了两次,并且两次 saveInstanceState 的时间都是空的。
-
请添加额外的日志记录,以便您在
onCreate()中记录对象实例ID(记录this的值)。这将告诉您是否在Activity的同一实例上调用了两次onCreate()(非常值得怀疑),或者是否正在创建Activity的 2 个实例。
标签: java android android-activity