2013-04-16 171 views
0

我有一個廣播接收器進入我的應用程序,等待屏幕開/關。我想要做的是:Android暫停廣播接收器

public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     pause some seconds... 
     ...do something 
    } 
} 

如何停止當前線程進入onReceive方法?

+0

這取決於你想在屏幕熄滅後做什麼。你是否希望確保「做某事」真的會在_wall time_的「幾秒鐘」之後發生,還是你想的其他事情? –

+0

實際上,我還有一些其他的想法:我希望在屏幕空白超過10秒的時間內對screenOff/screenOn執行的操作僅執行 – user1071138

+0

感謝您的澄清。我提出了一個建議。 –

回答

-1

使用Handler.postDelayed方法。

所以你的代碼會是這樣的

Handler h = new Handler(); 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     h.postDelayed(new Runnable(){ 
      public void run(){ 
        // do something 
      } 
      },pause_time_in_milis); 
    } 
} 
+0

我認爲設備可以在'ACTION_SCREEN_OFF'事件和'Runnable'之間進入睡眠狀態,不是嗎? –

+0

對不起,我沒有正確解釋我的問題。如果屏幕關閉超過10秒以上,我想盡我所能,否則什麼也不做......這可能嗎? – user1071138

+0

我的意思是,有什麼方法可以知道屏幕已經關閉了多久? – user1071138

5

你不能,你不應該暫停BrodcastReceiver既不postDelayed到處理程序();

你不應該阻止它,因爲該線程需要做其他的事情,所以不要阻止它,因爲這是一個糟糕的設計。

,你不能從文檔,因爲postDelay:

一旦你的onReceive()返回時,廣播接收器不再 活躍,它的宿主進程只是像任何其他應用程序 一樣重要正在運行的組件。尤其是 重要,因爲如果該過程僅託管 BroadcastReceiver(對於用戶具有 從未或最近未與之交互過的應用程序的常見情況),則在從 返回onReceive()時,系統將認爲其進程是空和 積極殺死它,使資源可用於其他更多 重要的過程。

這意味着從onReceive()返回的那一刻,所有這些可能會非常快地被殺死。

如果你想在播出一段時間後發生某些事情,你可以啓動一個服務,並且該服務等待時間,或者如果你想等待的時間超過幾秒鐘,你應該在AlarmManager中啓動該服務,讓AlarmManager爲您啓動服務。

+0

這是正確的。您不能在onReceive()中執行長時間運行的操作。有10秒的超時時間,之後系統可能認爲線程被阻塞並將其終止。 – NickT

3

根據我們的簡短說明,我建議您比onReceive()使用AlarmManagerset(RTC, System.currentTimeMillis()+10000, thePendingIntentToNotifyYou)。這樣,您將在十秒後通知,除非設備進入睡眠狀態。 (否則請使用RTC_WAKEUP)。

通過您的廣播接收器,您還會被告知屏幕被關閉和打開(如果您不這樣做,您還需要監聽以停止定時器它已經),並將不得不維護一個小型狀態機,以便知道你正在尋找的狀態(屏幕關閉十秒)是否在觸發thePendingIntentToNotifyYou時觸發。

+0

我解決了一個更簡單的方法: – user1071138

+0

@ user1071138你是如何實現它? –

+0

進入onReceive方法: if(intent.getAction()。equals(Intent.ACTION_SCREEN_OFF)){ wasScreenOn = false; handler.postDelayed(新的Runnable(){@Override 公共 無效的run(){ 如果(wasScreenOn){ 做某事 hasStopped =真;! } }},10000); (intent.getAction()。equals(Intent.ACTION_SCREEN_ON)){ wasScreenOn = true; if(hasStopped){ 做些什麼... hasStopped = false; } } – user1071138