Android暂停广播接收器



我有一个广播接收器到我的应用程序,等待屏幕打开/关闭。我想做的是:

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

如何在onReceive方法中停止当前线程?

你不能也不应该暂停BrodcastReceiver或者postDelayed到Handler();

你不应该因为这个线程需要做其他事情而停止它,所以不要因为它是一个糟糕的设计而阻止它。

和你不能postDelay因为从文档:

一旦你从onReceive()返回,BroadcastReceiver就不再存在了活动的,并且它的托管进程与其他进程一样重要其中运行的应用程序组件。这是特别的很重要,因为如果那个进程只是托管BroadcastReceiver(用户拥有的应用程序的常见情况)从未或最近没有互动过),然后从onReceive(),系统将认为它的进程是空的积极地杀死它,这样资源就可以被其他更多的人使用重要过程。

这意味着当它从onReceive()返回时,所有这些都可能很快被终止。

如果你想在广播后的一段时间内发生一些事情,你可以启动一个服务,这个服务等待的时间,或者如果你想等待的时间超过几秒钟,你应该把这个服务的启动放在AlarmManager中,让AlarmManager为你启动服务。

根据我们的简短澄清,我建议您在onReceive()中使用与set(RTC, System.currentTimeMillis()+10000, thePendingIntentToNotifyYou)一起使用的AlarmManager。这样,除非设备进入睡眠状态,否则您将在10秒后收到通知。(否则使用RTC_WAKEUP)

通过你的广播接收器,你也会被告知屏幕被关闭和打开(你需要听,以及停止计时器,如果你还没有这样做的话),并且必须维护一个小的状态机,以便知道你正在寻找的条件(屏幕关闭十秒钟)是否在触发thePendingIntentToNotifyYou时保持。

使用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);
    }
}

最新更新