我正在开发一个需要随时接收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服务才能正确保存唤醒锁?
答案 0 :(得分:8)
相反,我正在广播接收器onReceive方法
中执行工作
欢迎您使用常规BroadcastReceiver
。 WakefulBroadcastReceiver
对你没有好处。但是,除非这项工作少于几毫秒,否则你真的应该有IntentService
的工作。
在您致电WakefulBroadcastReceiver是否需要Intent服务才能正确保存唤醒锁?
WakefulBroadcastReceiver
之前, WakeLock
未获得startWakefulService()
。
答案 1 :(得分:1)
所以设备应该保持清醒以接收它
不,您的设备在收到通知时可能正在睡觉。
WakefulBroadcastReceiver,应该确保设备保持唤醒 锁定以随时接收通知
不,WakefulBroadcastReceiver不是为此而创建的,实际上你误解了它。闲置一段时间后,CPU会进入睡眠状态。当收到通知时,它会唤醒并运行BroadcastReceiver的onRecieve方法。现在考虑你想在onRecieve方法上做很多工作,因为它在主线程上运行你会得到ANR错误,所以人们通常创建一个intentService并在默认情况下提供服务的工作线程上工作。现在你在一个工作线程上做了很多工作,所以CPU有可能因为你没有在CPU上创建任何锁而进入休眠状态,所以你必须锁定并使CPU保持清醒状态。为了做到这一点,为了让开发人员安卓团队轻松创建WakefulBroadcastReceiver。
然后它停止接收通知。
你犯了一些错误,因为收到的通知并没有因为CPU的状态而失望。(如果你在清单中定义接收者)。