旧API版本的应用程序退出后,Android活动仍处于活动状态



我的问题发生在以下用户行为上:

  1. 打开应用程序
  2. 关闭应用程序(使用后退按钮)
  3. 从纵向旋转到横向(或从横向旋转到纵向)
  4. 打开应用程序

当第二次打开应用程序时,由于屏幕方向已更改,onCreate方法将执行两次。

我做了一些测试,似乎只有运行Android 3.0以上版本的设备才会出现问题(我没有对每个版本都进行测试)。

在我运行Android 4.0的平板电脑上,应用程序在第二次启动时以正确的初始方向打开,导致onCreate方法只被调用一次。但在我运行Android 2.3.5(HTC Desire HD)的手机上,第二次启动会以错误的方向打开上一个"活动"实例,导致重新启动并执行两次主活动的onCreate方法。

我已经阅读了Tasks和Back Stack|Android Developers,并尝试在主要活动中使用android:launchModeandroid: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将只执行一次。

相关内容

  • 没有找到相关文章

最新更新