我的问题发生在以下用户行为上:
- 打开应用程序
- 关闭应用程序(使用后退按钮)
- 从纵向旋转到横向(或从横向旋转到纵向)
- 打开应用程序
当第二次打开应用程序时,由于屏幕方向已更改,onCreate
方法将执行两次。
我做了一些测试,似乎只有运行Android 3.0以上版本的设备才会出现问题(我没有对每个版本都进行测试)。
在我运行Android 4.0的平板电脑上,应用程序在第二次启动时以正确的初始方向打开,导致onCreate
方法只被调用一次。但在我运行Android 2.3.5(HTC Desire HD)的手机上,第二次启动会以错误的方向打开上一个"活动"实例,导致重新启动并执行两次主活动的onCreate
方法。
我已经阅读了Tasks和Back Stack|Android Developers,并尝试在主要活动中使用android:launchMode
、android:clearTaskOnLaunch
等的各种组合。但这似乎并不是诀窍。
有什么建议吗?从Android 2.0到3.0,使用"后退"按钮退出应用程序的方式是否发生了任何变化?或者这只是发生在某些设备上,独立于Android版本?
活动:
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(getClass().getName(), "onCreate");
setContentView(R.layout.main);
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, MyActivity" />
</LinearLayout>
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="7"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="MyActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
我认为解决这个问题的正确方法是避免在Activity的onCreate方法中做很多事情,这样方向的改变就不会引起问题。
看看这个问题:活动重启上轮换安卓
或者,在清单中声明android:configChanges="orientation"
应该通知OS,它不应该在方向更改时销毁和重新创建活动,而是调用onConfigurationChanged
。
Sergey是对的,如果您将添加到代码中
<activity android:name="MyActivity"
android:label="@string/app_name"
android:configChanges="orientation">
和
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(getClass().getName(), "onCreate");
if(savedInstanceState == null) {
setContentView(R.layout.main);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
}
当活动启动时,onCreate将只执行一次。