WakefulBroadcastReceiver是否需要IntentService来保存唤醒锁?

时间:2015-01-28 17:10:11

标签: android broadcastreceiver

我正在开发一个需要随时接收GCM通知(并向服务器发送信息)的应用,因此设备应该保持清醒以接收它,即使屏幕长时间关闭也是如此。

我正在使用 WakefulBroadcastReceiver ,这应该确保设备持有唤醒锁以随时接收通知(据我所知,如果我弄错了,请纠正我)< / p>

但是我没有调用Intent服务(按the docs中的说明),而是在广播接收器 onReceive 方法中执行工作:

public class GCMReceive extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        /* Do my work */
    }
}

它工作正常,除非设备长时间处于非活动状态,然后它停止接收通知。我在这里错过了什么吗? WakefulBroadcastReceiver 是否需要Intent服务才能正确保存唤醒锁?

2 个答案:

答案 0 :(得分:8)

  

相反,我正在广播接收器onReceive方法

中执行工作

欢迎您使用常规BroadcastReceiverWakefulBroadcastReceiver对你没有好处。但是,除非这项工作少于几毫秒,否则你真的应该有IntentService的工作。

  

WakefulBroadcastReceiver是否需要Intent服务才能正确保存唤醒锁?

在您致电WakefulBroadcastReceiver之前,

WakeLock未获得startWakefulService()

答案 1 :(得分:1)

  

所以设备应该保持清醒以接收它

不,您的设备在收到通知时可能正在睡觉。

  

WakefulBroadcastReceiver,应该确保设备保持唤醒   锁定以随时接收通知

不,WakefulBroadcastReceiver不是为此而创建的,实际上你误解了它。闲置一段时间后,CPU会进入睡眠状态。当收到通知时,它会唤醒并运行BroadcastReceiver的onRecieve方法。现在考虑你想在onRecieve方法上做很多工作,因为它在主线程上运行你会得到ANR错误,所以人们通常创建一个intentService并在默认情况下提供服务的工作线程上工作。现在你在一个工作线程上做了很多工作,所以CPU有可能因为你没有在CPU上创建任何锁而进入休眠状态,所以你必须锁定并使CPU保持清醒状态。为了做到这一点,为了让开发人员安卓团队轻松创建WakefulBroadcastReceiver。

  

然后它停止接收通知。

你犯了一些错误,因为收到的通知并没有因为CPU的状态而失望。(如果你在清单中定义接收者)