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

根据我们的简短说明,我建议onReceive()您将AlarmManagerset(RTC, System.currentTimeMillis()+10000, thePendingIntentToNotifyYou). 这样,除非设备进入睡眠状态,否则您将在十秒后收到通知。(RTC_WAKEUP以其他方式使用。)

通过您的广播接收器,您还将被告知屏幕正在关闭和打开(如果您还没有这样做,您还需要收听以停止计时器)并且必须保持一个小状态机,以便在触发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 回答