我在 Activity 的 onCreate 方法中有一些代码,并注意到它被调用了三次。这是正常行为吗?谢谢。
除了预期的情况外,我观察到只有那些创建新线程或可运行的活动(onCreate)被调用两次。 (我相信这是 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
}
}
您可能需要阅读有关活动生命周期的文档。
OnCreate 在 Activity 的每个生命周期中只会被调用一次。 然而,有很多情况可能会导致您的 Activity 被终止或恢复。 这样,onCreate就会被再次调用。
为了正确支持这一点,您可以在 onSaveInstanceState 中保存状态信息,并从创建时进入的状态包中恢复它。
在我的例子中,子类的
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);
}
...
在我的例子中,它在onCreate之后调用setDefaultNightMode:
super.onCreate(savedInstanceState);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
这解决了它:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
super.onCreate(savedInstanceState);
我也遇到了类似的问题,是由 MobileAds 引起的。 在我初始化它们之后,问题就消失了。
有 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 次)。
如果您用来启动活动的不是此侦听器类型,您可能需要查看文档以了解触发您的活动的任何侦听器,以了解您是否遇到类似的情况。 很可能不仅仅是一个事件触发侦听器。
将属性
android:configChanges="orientation|keyboardHidden"
MainLauncher = true
类中。
MainActivity.cs
方法中管理
savedInstanceState
。OnCreate