2013-10-13 48 views
20

如提到的here,當屏幕熄滅時,將調用當前Activity的onStop()。當我的ActivityonStop()被調用時,我需要檢查屏幕開/關狀態。所以我已經爲這些操作(ACTION_SCREEN_ONACTION_SCREEN_OFF)註冊了BroadcastReceiver來記錄當前的開/關狀態(並且它們正常工作,我已經記錄!)。
但是當我關閉屏幕並檢查onStop中的開/關狀態時,表示屏幕已打開。爲什麼?我認爲在調用onStop之前接收器必須收到ACTION_SCREEN_OFF,所以出了什麼問題?如何檢查onStop()中的屏幕開/關狀態?

+1

「我認爲在onStop被調用之前,接收器必須接收ACTION_SCREEN_OFF,所以出了什麼問題?」 - 我不知道你爲什麼會這樣認爲。使用'Log'語句或斷點來查看哪些被首先調用。更好的是,重新設計你的應用程序,而不關心是否因爲屏幕關閉而調用了onStop(),與其他原因相比。 – CommonsWare

+0

@CommonsWare這個應用程序必須能夠區別'onStop'被調用的不同情況,所以我必須知道是否關閉屏幕導致'onStop'被調用或其他事情。更好的解決方案? – Soheil

+0

「該應用程序必須能夠區分onStop被調用的不同情況」 - 爲什麼?屏幕關閉或用戶按下HOME,或用戶按下BACK,或用戶接聽來電,或用戶點擊通知,或用戶做了其他任何事情,它對您的應用程序有什麼不同?導致你的活動不再可見?屏幕關閉通常不是特例。 – CommonsWare

回答

41

你可以嘗試使用PowerManager的系統服務,爲這個目的,我這裏是和official documentation(注意:這個方法在API級別7加入):

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
boolean isScreenOn = pm.isScreenOn(); 

編輯:

isScreenOn()方法已被棄用API級別21.您應該使用isInteractive代替:

boolean isScreenOn = pm.isInteractive(); 

http://developer.android.com/reference/android/os/PowerManager.html#isInteractive()

+2

優秀的亞歷山大! 'BroadcastReceiver'沒有收到我想要的動作,但是這個人做到了:) – Soheil

+0

'pm.isScreenOn()'已棄用。 –

+0

@SuperThomasLab改爲使用什麼? –