在ICS和Gingerbread上启动Android应用程序时的不同行为

时间:2012-06-13 17:56:42

标签: android android-intent android-manifest

我的应用程序包含一个主要活动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 site预期如下:

  

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

这是我在我的模拟器(Gingerbread)上获得的行为,但不是我的Nexus S(ICS)上的行为。

由于

2 个答案:

答案 0 :(得分:0)

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

  

立即销毁活动

     

告诉系统销毁活动   一旦它停止(好像Android必须回收内存)。这个   对于测试onSaveInstanceState(Bundle)非常有用   onCreate(android.os.Bundle)代码路径,否则将是   很难逼。选择此选项可能会显示一个数字   因未保存状态而导致应用程序出现问题。更多   有关保存活动状态的信息,请参阅活动   文档。

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

编辑:但这并不能解释下面的引用。

  

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

答案 1 :(得分: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上测试过)。它在模拟器中都能正常工作,因此您无法使用模拟器行为来指示实际的设备行为。