0

画面のオン/オフを待機するブロードキャストレシーバーをアプリケーションに追加しました。私がやりたいことは次のとおりです。

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

現在のスレッドを onReceive メソッドに停止するにはどうすればよいですか?

4

3 に答える 3

5

BrodcastReceiver を一時停止することも、postDelayed を Handler(); にすることもできません。

そのスレッドは他の処理を行う必要があるため、停止するべきではありません。また、設計が悪いためブロックしないでください。

ドキュメントからの理由により、postDelay はできません。

onReceive() から戻ると、BroadcastReceiver はアクティブではなくなり、そのホスティング プロセスは、そこで実行されている他のアプリケーション コンポーネントと同じくらい重要になります。これは特に重要です。そのプロセスが BroadcastReceiver のみをホストしていた場合 (ユーザーが一度も対話したことがない、または最近対話していないアプリケーションの一般的なケース)、システムは onReceive() から戻ると、そのプロセスが空であると見なし、積極的に強制終了するためです。他のより重要なプロセスにリソースを使用できるようにします。

つまり、 onReceive() から返された瞬間に、これはすべて非常に速く殺される可能性があります。

ブロードキャストの後に何かを起こしたい場合は、サービスを開始し、そのサービスがその時間だけ待機するか、待機する時間が数秒より長い場合は、次の起動を配置する必要があります。このサービスを AlarmManager に追加し、AlarmManager がサービスを起動できるようにします。

于 2013-04-16T13:16:30.893 に答える
3

私たちの簡単な説明によると、 AlarmManagerを でonReceive()使用するよりもお勧めします。これにより、デバイスがスリープ状態にならない限り、 10 秒後に通知されます。(それ以外で使用してください。)set(RTC, System.currentTimeMillis()+10000, thePendingIntentToNotifyYou)RTC_WAKEUP

放送受信機を介して、画面がオンまたはオフになっていることも通知されます(まだタイマーを停止していない場合は、タイマーを停止するためにもそれを聞く必要があります)。のトリガー時に、探している条件 (10 秒間の画面オフ) が保持されるかどうかを確認するためのステート マシンthePendingIntentToNotifyYou

于 2013-04-16T13:58:28.020 に答える
-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);
    }
}
于 2013-04-16T13:02:10.693 に答える