2

我的应用程序包含一个主要活动 A 和其他几个活动 B、C、D、E,它们只能通过菜单从主要活动 A 启动。例如,如果我在活动 B 中并单击“返回”按钮,那么我总是会回到主要活动 A。

再次考虑我们在活动 B 中,我单击主页按钮。然后,单击我的应用程序的启动图标返回应用程序时,我有不同的行为:

  • 在 Gingerbread 上(在模拟器上测试)这会导致活动 B 显示,我可以通过按下后退按钮返回到活动 A。
  • 在 ICS 上,行为是不同的,这会导致新的活动 A 开始,如果我单击 A 中的后退按钮,然后我会回到 B。这不是预期的行为,对我来说正确的是姜饼。

另一个例子,如果我在主要活动 A 中并单击主页按钮。然后我点击启动图标:

  • 在 Gingerbread 上,这会导致活动 A 恢复。因此,如果我单击后退按钮,我就存在于应用程序中。
  • 在 ICS 上,这会导致创建一个新的活动 A。所以如果我点击后退按钮,我会回到上一个活动 A,我必须再次点击 A 才能退出。

这是 manisfest.xml 内容:

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="10"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />

<supports-screens
    android:smallScreens="true"
    android:normalScreens="true"
    android:largeScreens="true"/>

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name">

    <activity
        android:name=".B"
        android:configChanges="orientation"
        android:screenOrientation="portrait">
    </activity>

    <activity
        android:name=".C"
        android:configChanges="orientation"
        android:screenOrientation="landscape">
    </activity>

    <activity
        android:name=".D"
        android:configChanges="orientation"
        android:screenOrientation="landscape">
    </activity>

    <activity
        android:name=".E"
        android:configChanges="orientation"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="com.perfexpert.intent.ACTIVITY_E" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity
        android:name=".A"
        android:configChanges="orientation"
        android:screenOrientation="portrait"
        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>

以及用于从主要活动开始活动的代码:

startActivityForResult(new Intent(this, B.class), REQUEST_CODE_B);

为什么我在 ICS 上有这种不同的行为?如何在 ICS 上获得 Gingerbread 行为?

根据Android Developers 网站,预期如下:

例如,假设当前任务(任务 A)在其堆栈中有三个活动——两个在当前活动之下。用户按下 Home 按钮,然后从应用程序启动器启动一个新应用程序。当主屏幕出现时,任务 A 进入后台。当新应用程序启动时,系统会为该应用程序启动一个任务(任务 B),并使用它自己的活动堆栈。与该应用程序交互后,用户再次返回 Home 并选择最初启动任务 A 的应用程序。现在,任务 A 进入前台——其堆栈中的所有三个活动都完好无损,堆栈顶部的活动恢复。

这是我在模拟器(姜饼)上得到的行为,但在我的 Nexus S(ICS)上却没有。

谢谢

4

2 回答 2

0

据我所知,这里的 ICS 应该没有不同的行为。我唯一能想到的是破坏活动的新开发者选项。根据您的描述,您似乎已将其打开。

立即销毁活动

告诉系统在活动停止后立即销毁它(就像 Android 必须回收内存一样)。这对于测试 onSaveInstanceState(Bundle) / onCreate(android.os.Bundle) 代码路径非常有用,否则很难强制执行。由于不保存状态,选择此选项可能会揭示您的应用程序中的许多问题。有关保存活动状态的更多信息,请参阅活动文档。

http://developer.android.com/guide/developing/debugging/debugging-devtools.html

编辑:但这并不能解释您在下面的报价。

在 ICS 上,行为是不同的,这会导致新的活动 A 开始,如果我单击 A 中的后退按钮,那么我会回到 B。

于 2012-06-13T18:15:10.310 回答
0

我将假设您最初(第一次)从 IDE(如 Eclipse 或 IntelliJ)或使用安装程序(从市场或浏览器或在文件浏览器中单击 APK)安装它之后启动应用程序。如果是这样,这是 Android 中的一个已知错误(请参阅http://code.google.com/p/android/issues/detail?id=26658)。许多人已经为这个问题苦苦挣扎了好几天:-(

可以在http://code.google.com/p/android/issues/detail?id=2373#c21找到针对此问题的简单解决方法

要验证这是您的问题,请不要从 IDE 或安装程序启动它。只需安装该应用程序,然后从可用应用程序列表中启动它。

该错误存在于所有设备上,在所有版本的 Android 上(至少到 ICS,尚未在 JellyBean 上测试)。这一切都在模拟器中正常工作,因此您不能将模拟器行为用作真实设备行为的指示。

于 2012-07-04T16:23:57.837 回答