我在 Activity 的 onCreate 方法中有一些代码,并注意到它被调用了 3 次。这是正常行为吗?谢谢。
8 回答
您可能想通读有关Activity 生命周期的文档。
OnCreate 在 Activity 的每个生命周期中只会被调用一次。但是,有许多情况可能会导致您的活动被终止并恢复活力。因此,将再次调用 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
}
}
就我而言,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 上设置以下语句,在活动配置中:
android:configChanges="orientation|keyboardHidden"
更多信息,您可以查看官方文档
以下是我遇到(并解决)的一个场景,它产生了您所描述的行为:
有 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 在 AVD 上显示信息 3 次