我对旋转Android设备有疑问。我的代码在onCreate(...)中记录了一个静态和非静态属性。
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
static int sn;
int n;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sn++;
n++;
Log.i("onCreate", String.format("sn=%d n=%d", sn, n));
}
}
屏幕方向为纵向。当我第一次运行代码时,我得到了:
onCreate(): sn=1 n=1
将屏幕旋转到横向后,我得到了:
onCreate(): sn=2 n=1
在我再次将屏幕旋转为肖像后,我得到了:
onCreate(): sn=3 n=1
onCreate(): sn=4 n=1
我的问题是:
答案 0 :(得分:28)
这是模拟器中的已知问题(请参阅讨论here)。这不是一个错误,但对于许多人来说,这是一个问题。据我了解,基本问题是,当您的活动进入纵向模式时,它会重新启动两次,因为模拟器分别处理两个配置更改:方向更改本身和键盘取消激活。它不会发生在另一个方向,因为没有与键盘激活相对应的配置更改事件。 (我发现这很奇怪,但显然这是出于某种原因所希望的行为。)
无论如何,解决方案似乎是将此添加到您的活动清单声明中:
android:configChanges="keyboardHidden|orientation"
如果您确实需要这些更改来加载新资源,您可以在onConfigurationChanged中手动处理它。
答案 1 :(得分:10)
每当更改屏幕方向时,该活动都会被销毁,新活动将以onCreate()
方式启动。
因此,每次旋转屏幕时,活动都将被销毁,新活动将以onCreate()
方法开始。
您可以通过覆盖onSaveInstanceState(Bundle b)
方法来保存非静态成员。
每当屏幕旋转时Android都会调用此方法,并且给定的包b将传递给oncreate(Bundle b)
,您可以从中提取非static
成员。
答案 2 :(得分:3)
不了解onCreate
问题;那些电话来自操作系统。
非静态(“实例”)变量应保存在instanceState
;这就是它的用途。请参阅总结的posts like this,或讨论应用程序生命周期的大多数基本Android教程。
答案 3 :(得分:1)
这很简单:您可以在代码中覆盖onConfigurationChanged()方法。
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
所以现在你的非静态变量不会受到影响,因为在这段时间你的Activity不会被销毁,而且新的活动也不会被onCreate()方法启动。
答案 4 :(得分:0)
每次旋转屏幕活动都会被重新创建 - 这是android的概念。
但是在你的情况下,当活动重新创建时,静态值将被保留..而non static
将被重新初始化...所以你总是得到n=1
......
如果您真的想保留非静态值,请转到Shared Preferences。在此,您可以保留所需的所有值,直到用户清除数据....
否则只需将non static
设为static
即可解决您的猜测
答案 5 :(得分:0)
将此行放在AndroidManifest.xml文件中的活动中:
android:launchMode="singleInstance"
"
singleTask
"和"singleInstance
"活动只能开始一项任务。 它们始终位于活动堆栈的根部。而且, 设备一次只能容纳一个活动实例 - 只有一个 这样的任务。A"
singleInstance
"另一方面,活动不允许其他活动 活动成为其任务的一部分。它是该任务中唯一的活动。 如果它启动另一个活动,则将该活动分配给a 不同的任务 - 好像FLAG_ACTIVITY_NEW_TASK
在意图中。