Java 未完成类字段的Android初始化
在这件事上,我一直在努力寻找合适的标题。我遇到过一些奇怪/令人困惑的情况,这些情况只有在我有时初始化字段时才被发现 在这种情况下,我有一个布尔值,我初始化为false(我知道,冗余…但是…) 应用程序运行正常,并且在退出之前,我的布尔值设置为true。我观察日志猫以查看是否调用了onDestroy() 然后重新启动应用程序 我的布尔值为true,我现在在onCreate()中登录它的值 WTFJava 未完成类字段的Android初始化,java,android,initialization,ondestroy,Java,Android,Initialization,Ondestroy,在这件事上,我一直在努力寻找合适的标题。我遇到过一些奇怪/令人困惑的情况,这些情况只有在我有时初始化字段时才被发现 在这种情况下,我有一个布尔值,我初始化为false(我知道,冗余…但是…) 应用程序运行正常,并且在退出之前,我的布尔值设置为true。我观察日志猫以查看是否调用了onDestroy() 然后重新启动应用程序 我的布尔值为true,我现在在onCreate()中登录它的值 WTF 我注意到该活动以一个新的PID开始。然而,它绕过了字段初始化。请注意,我有些不是多余的。这是怎么回事
我注意到该活动以一个新的PID开始。然而,它绕过了字段初始化。请注意,我有些不是多余的。这是怎么回事 然后,我从设备上的设置菜单强制停止应用程序。重新启动应用程序后,将按预期显示所有内容,布尔值=false 那么onDestroy()不是一个可靠的/真正的终端吗?我不记得读过这样的书 这不是我的应用程序,而是一个例子:
public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
private static boolean b = false;
private static int i = 1;
private static final String TAG = "junk app";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG, "==================================================================");
if(b) Log.i(TAG,"boolean is true");
if(!b) Log.i(TAG,"boolean is false");
Log.i(TAG,"The value of i is"+i);
i++;
b=!b;
foo();
}
public void foo() {
finish();
}
@Override
public void onResume() {
Log.i(TAG,"onResume");
super.onResume();
}
@Override
public void onStop() {
Log.i(TAG,"onStop");
super.onStop();
}
@Override
public void onDestroy() {
Log.i(TAG,"onDestroy");
super.onDestroy();
}
}
在设备上运行此应用程序并查看日志。调用onDestroy()。现在从图标重新启动应用程序。i递增,b变为!b
IDK但我(天真的)期望是,如果一个应用程序被破坏,如果它被重新启动,它会重新启动,所有初始化等都会再次完成
静态是静态的——它们对流程是全局的。那么它们的价值呢
将持续整个流程的生命周期,这通常是非常重要的
比单个活动实例更长
来源:请发布一个重新创建此问题的简单代码示例。您是否在
ondestory()
中将布尔值设置为false
?否。布尔值在初始化部分设置为false,即在公共类MainActivity之后。它后来被设置为true。该应用程序最终被销毁。如果重新启动应用程序,布尔值仍然为真“我注意到活动以新PID开始…”你确定吗?有证据吗?哇那真的很有趣。。我也刚刚看到了它的实际应用。。我离开办公桌45分钟,重新开始上面的测试,它带有一个新的PID,所有的静态都被重新初始化。我将在将来记住这一点,现在通过我的代码返回,看看应该更改什么。感谢您快速准确的回复!事实上我和你有着同样的理解,所以我很高兴我也从中学到了一些东西。我尽量避免使用静态变量,但有时我需要它们,最好至少了解一下幕后发生的事情。