我在onCreate方法和Activity中有一些代码,并注意到它被调用了三次。这是正常的行为吗?感谢。
答案 0 :(得分:25)
您可能需要阅读Activity lifecycle上的文档。
OnCreate只会在Activity的每个生命周期中调用一次。但是,有许多情况会导致您的活动被杀死并恢复生机。因此,onCreate将再次被调用。
为了正确支持这一点,您可以将状态信息保存在onSaveInstanceState中,并在创建时获取的状态包中恢复它。
答案 1 :(得分:18)
除了预期的情况之外,我观察到只有那些活动(onCreate)被调用两次,这些活动正在创建新的Thread或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
}
}
答案 2 :(得分:2)
如果您在开发人员设置中启用了“不要离开活动”,也会发生这种情况。
答案 3 :(得分:1)
您还可以自行处理配置更改,在AndroidManifest上设置以下语句,在活动配置中:
android:configChanges="orientation|keyboardHidden"
有关详细信息,请查看official documentation
答案 4 :(得分:1)
就我而言,子类的 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);
}
...
答案 5 :(得分:0)
以下是我遇到(并解决)的情景,它会产生您描述的行为:
有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)。
如果您不是使用此侦听器类型来启动活动,则可能需要查看文档以了解触发您的活动的任何侦听器,以查看您是否遇到类似的情况。有可能不只是一个事件触发了听众。
答案 6 :(得分:0)
我遇到了类似的问题,这是由MobileAds引起的。
在super.onCreate(...)
之前初始化它们之后,问题就消失了。
答案 7 :(得分:0)
在某些情况下,可能是由于多次记录。在调试模式下运行您的应用程序,并检查您的代码是否运行两次或只是多次记录。
如果仅记录日志,请检查我在以下问题中的答案: Logcat showing information 3 times on AVD