2012-05-31 41 views
10

我有一個活動,需要在啓動時打開屏幕(以防萬一屏幕關閉)。所以在我的onCreate,我有:爲什麼在我的活動啓動後,onStop被立即調用?

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
      |WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
      |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

使用這種簡單的組合,我能夠引起我的活動,以顯示它時,從我的後臺服務啓動(是的,這是合法的情況下)。

然而問題是,當我在這種情況下啓動我的活動時,存在非常奇怪的生命週期行爲。使用廣泛的日誌,我能弄清楚,以下7個步驟發生立即活動啓動後:

  1. 的onCreate
  2. 在onStart
  3. 的onResume
  4. 的onPause
  5. 的onStop
  6. onStart
  7. onResume

看到了嗎?對於簡單的活動開始,onStart被調用兩次。更重要的是,onStop被神祕地稱爲,儘管這項活動剛剛開始 - 沒有任何事情會導致它停止。

我已經在很多不同的場景中測試過這種情況,看起來這種奇怪的行爲只發生在屏幕關閉和活動被銷燬後啓動時。如果屏幕開啓,或者活動已停止[但尚未銷燬],活動將正常啓動,並且onStart只會被調用一次。

底線:看來,當我的活動推出,並在屏幕被迫上,Android的啓動活動,然後停止它,然後再次啓動沒有明顯的原因。

所以:爲什麼會發生這種情況?有什麼我可以做的,以解決這個問題(以便onStop不會被調用,直到它有一個合法的原因)?


注:

  • 有關活動使用singleTask launchmode
  • 我曾嘗試禁用鍵盤鎖/鎖,但它沒有任何效果
  • 我看到在這個行爲運行Android 3.2的三星Galaxy Tab 10.1。我沒有測試過這是否適用於其他任何東西...
+0

當活動需要旋轉時,我有類似的行爲。在我的情況下,AndroidManifest中的活動有一個未指定的方向。在onCreate期間,我根據狀態機設置方向。當我設定的方向不是當前的方向時,意味着活動需要旋轉,我會看到你描述的怪異生命週期。你找到答案了嗎? – kingston

+0

我也檢查過onPostResume是在onPause之前調用的。 – kingston

+1

此處描述的解決方案適用於我: [開始活動後立即調用OnPause和OnStop()](http://stackoverflow.com/questions/25369909/onpause-and-onstop-called-immediately-after-starting-activity ) – cyberhuman

回答

-2

您可以爲您在onStart的情況下,設置靜態或全局變量,然後檢查變量onStop越過標準的行爲。

+0

但是,如何區分onStop的「好」情況和「糟糕」情況? – yydl

+0

通過檢查變量。 – Mundi

+0

是的,但正如我寫的,這並不總是發生 - 只有屏幕關閉。所以如果屏幕開啓,你的方法將不起作用 – yydl

2

我有一個類似的問題在這裏: Activity Lifecycle X Power Button X Lock Screen

的問題是,由於我的活動被迫景觀,當我把在屏幕上就顯示出在縱向鎖屏和它造成的配置變化,因此破壞當前的活動。

解決的辦法是在我的AndroidManifest.xml的Activity中添加一個android:configChanges =「orientation」。

+1

良好的通話。但是還需要添加一個:android:configChanges =「keyboardHidden | orientation」。有了ICS +,你將需要android:configChanges =「keyboardHidden | orientation | screenSize」。 –

1

正如@cyberhuman所建議的,對這個問題的回答OnPause and OnStop() called immediately after starting activity指出了我的正確方向。

我的問題是,在實際顯示給用戶之前完成一個完整的「虛擬」生命週期的活動是,當活動變爲可見時,我嘗試播放鈴聲直接由附加的隨後的「onStop()」靜音,並且在屏幕關閉時/屏幕鎖定時/屏幕開啓時/活動在後臺運行時啓動時使用標誌使活動正常運行是不可能的。

我終於通過覆蓋onWindowFocusChanged(boolean hasFocus)方法並從那裏啓動鈴聲來解決我的問題。把它放在這裏以防有人遇到同樣的問題。

相關問題