2012-06-13 16 views
1

我的應用程序包含一個主要活動A和幾個其他活動B,C,D,E,這些活動只能通過菜單從主要活動A啓動。 例如,如果我在活動B中,然後單擊後退按鈕,則我總是回到主要活動A.在ICS和薑餅上啓動Android應用程序時出現的不同行爲

再次考慮我們處於活動B中,然後單擊主頁按鈕。然後,我有不同的行爲,點擊我的應用程序的啓動圖標時,返回到應用程序:

  • 在薑餅(模擬器上測試)這個原因活動B到顯示和我能夠回去活性的是按下後退按鈕。
  • 在ICS上的行爲是不同的,這導致一個新的活動A開始,如果我點擊A中的後退按鈕,那麼我回到B.這不是預期的行爲,對我來說正確的是薑餅一個。

另一個例子,如果我在主要活動A和我點擊主頁按鈕。然後我點擊發射圖標:

  • 關於薑餅,這導致活動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上的薑餅行爲?

據預計Android Developers site的是:

假設,例如,當前任務(任務A)在其堆棧兩當前活動在三個活動。用戶按下主頁按鈕,然後從應用程序啓動器啓動新的應用程序。主屏幕出現時,任務A進入後臺。當新應用程序啓動時,系統會使用自己的一系列活動啓動該應用程序的任務(任務B)。在與該應用程序交互之後,用戶再次返回Home並選擇最初啓動Task A的應用程序。現在,Task A進入前臺 - 堆棧中的所有三個活動都保持不變,並且堆棧頂部的活動恢復。

這是我在我的模擬器(薑餅)上得到的行爲,但不是在我的Nexus S(ICS)上。

謝謝

+0

如果你正在調用活動A「你的主要活動」,是否有理由將它聲明爲'singleInstance'? – Falmarri

+0

@Falmarri因爲當我在2011年7月發佈應用程序時,所有工作都正常。我的薑餅模擬器的工作方式是根據[this]的正確方法(http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html) – DanGTZ

+0

@Falmarri不要使用launchMode =「singleInstance」!這絕對不是你想要的。這會導致比解決問題更多的問題,而不是正確的解決方案 –

回答

0

據我所知,在這裏ICS應該沒有不同的行爲。 我能想到的唯一的事情就是用於銷燬活動的新開發人員選項。 從你所描述的,似乎你已經打開。

立即銷燬活動

告訴系統,因爲它被停止儘快銷燬活動 (如Android是否有回收內存)。這個 對onSaveInstanceState(Bundle)/ onCreate(android.os.Bundle)代碼路徑的測試非常有用,否則該代碼路徑將難以強制執行 。由於未保存狀態,選擇此選項可能會在應用程序中顯示 問題。有關保存活動狀態的更多信息,請參閱活動 文檔。

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

編輯:但是這並不能說明下方的報價。

在ICS的行爲是不同的,這會導致一個新的活動一開始 ,如果我點擊一則後退按鈕我回來B.

+0

謝謝你的回覆。我查了一下,「Immediatly destroy activities」選項是關閉的。所以這不是問題,謝謝。我的ICS設備是Nexus S(4.0.4),沒有安裝開發工具,薑餅設備是仿真器(2.3.4)。我第一次注意到這個問題是在將我的Nexus S升級到ICS之後。 – DanGTZ

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上測試過)都存在該錯誤。因爲它應該在仿真器中工作,所以您不能將仿真器行爲用作實際設備行爲的指示。

相關問題