【发布时间】:2011-04-05 01:24:46
【问题描述】:
我在 Activity 的 onCreate 方法中有一些代码,并注意到它被调用了 3 次。这是正常行为吗?谢谢。
【问题讨论】:
-
onCreate 将在您的活动被销毁并重新创建时被调用,这发生在设备旋转、键盘打开或您切换应用程序并且系统决定是时候回收一些内存和杀死你的应用程序。也许这在这里触发了这种行为?
我在 Activity 的 onCreate 方法中有一些代码,并注意到它被调用了 3 次。这是正常行为吗?谢谢。
【问题讨论】:
您可能需要阅读Activity lifecycle 上的文档。
在 Activity 的每个生命周期中只会调用一次 OnCreate。但是,有许多情况可能会导致您的活动被终止并恢复活力。因此,将再次调用 onCreate。
为了正确支持这一点,您可以将状态信息保存在 onSaveInstanceState 中,并从您在创建时获得的状态包中恢复它。
【讨论】:
除了预期的情况外,我观察到只有那些活动 (onCreate) 被调用了两次,它们正在创建新的线程或 Runnable。 (我认为这是 Android 中的一个错误)。
解决方案很简单(虽然你可能不喜欢它:p)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
if(savedInstanceState == null){
// everything else that doesn't update UI
}
}
【讨论】:
savedInstanceStatewasn't null 是否执行我的代码的问题
在我的例子中,子类的onCreate 方法运行了两次。在调用超类的onCreate 方法后更改主题会导致此问题。我在超类的onCreate 方法之前设置了主题,然后没有再次调用子类的onCreate 方法。
public class XActivity extends YActivity { // XActivity is subclass
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xl);
}
...
public class YActivity extends AppCompatActivity { //YActivity is superclass.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme();
}
...
转换成这个:
public class YActivity extends AppCompatActivity { // YActivity is superclass.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
setTheme();
super.onCreate(savedInstanceState);
}
...
【讨论】:
我遇到了类似的问题,它是由 MobileAds 引起的。
在我在super.onCreate(...) 之前初始化它们之后,问题就消失了。
【讨论】:
如果您在开发者设置中打开了“不要离开活动”,也会发生这种情况。
【讨论】:
您也可以自己处理配置更改,在AndroidManifest上设置以下语句,在activity配置中:
android:configChanges="orientation|keyboardHidden"
更多信息,您可以查看official documentation
【讨论】:
以下是我遇到(并已解决)的一个场景,它会产生您所描述的行为:
有 3 个事件会触发 OnTouch - 1. android.view.MotionEvent.ACTION_UP 2. android.view.MotionEvent.ACTION_DOWN 3. android.view.MotionEvent.ACTION_MOVE。
通常,所有这三个事件同时触发以触发 OnTouch 侦听器。当此侦听器用于启动活动时(通过传递给 startActivity() 的 Intent),您可以重现此行为,该行为将多次调用 Activity 上的 OnCreate(本例中为 3 次)。
如果您用于启动活动的不是此侦听器类型,您可能需要查看文档以了解触发您活动的侦听器以查看您是否遇到类似情况。触发监听器的可能不止一个事件。
【讨论】:
在某些情况下,可能是因为多次记录。在调试模式下运行您的应用程序并检查您的代码是运行两次还是只是多次记录。
如果它只是记录检查我在这个问题中的答案: Logcat showing information 3 times on AVD
【讨论】: