即时接收广播接收器的意图,然后我开始服务做更多的工作。现在如果设备是睡眠并且发生这种情况,我必须得到Wakelock(AlarmManger?),为什么我需要它? 如果设备在没有唤醒的情况下进入睡眠状态,我的服务将停止运行。广播接收器,服务和Wakelock
回答
现在如果设备是睡眠,这发生了什么,我必须得到Wakelock(AlarmManger?),为什么我需要它?
如果设备先睡着了,您将不会“收到广播接收方的意图”,因为设备处于睡眠状态。
我必须得到Wakelock(AlarmManger?),为什么我需要它?
除非要确保设备在完成某些工作时保持运行状态,否则不需要它。
如果设备在没有获得唤醒锁的情况下进入睡眠状态,我的服务将停止运行。
是的。
public class WakeLockManager extends BroadcastReceiver {
private static WakeLock mWakeLock;
private String LCLT;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Consts.WAKELOCK_INTENT)) {
Log.v("wakelock", "GOT THE wakelock INTENT");
boolean on = intent.getExtras().getBoolean("on");
if (mWakeLock == null) {
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"Breeze WakeLock");
}
if (on) {
if (!mWakeLock.isHeld()) {
mWakeLock.acquire();
Log.v("wakelock", "acquiring wakelock");
}
} else {
if (mWakeLock.isHeld()) {
Log.v("wakelock", "releasing wakelock");
mWakeLock.release();
}
mWakeLock = null;
}
}
}
}
看看上面的代码..put在一个单独的类文件,并在您的清单中定义它的一些自定义的意图....现在,这个类将一个自定义的意图回应...只是播出的意图,你可以在你的整个应用程序打开激活锁定或关闭,因为激活锁定是static..like这样的:
public void setWakeup(boolean status) {
Intent wakelock_Intent = new Intent(CUSTOM_INTENT);
wakelock_Intent.putExtra("on", status);
this.sendBroadcast(wakelock_Intent);
}
以上将被定义在alarmmanager代码,以便它安排一个电话
你确定这个“静态锁定“将不会在Receiver'class'卸载时被擦除?请参阅:http://stackoverflow.com/questions/6299283/broadcastreciever-life-cycle-static-variables#comment7376537_6299862 – 2013-04-25 15:03:25
我假设该对象不会被垃圾收集,因为这不是一个匿名的broadcastReceiver。如果我自己分配这个对象并保持对它的一个硬引用,为什么它会被系统释放?这是一个有趣的话题,请指教。 – j2emanue 2013-04-26 20:32:10
看起来像Android的本地WakefulBroadcastReceiver将是一个完美的解决方案。需要在“清醒”的方式,而扩大这种比普通广播接收器并开始在的onReceive(服务):
startWakefulService(context, service);
,并显示你的工作是在服务的onHandleIntent()完成 ,打电话
MyWakefulReceiver.completeWakefulIntent(intent);
- 1. 广播接收器和服务
- 2. 服务和广播接收器
- 3. 服务或广播接收器
- 4. 广播接收器不被服务
- 5. 从广播接收器启动服务
- 6. 广播接收器未启动服务
- 7. Android服务或广播接收器
- 8. 服务内的广播接收器
- 9. 广播接收器和phonestatelistener
- 10. 广播接收器和ContentResolver
- 11. 广播接收器中的WakeLock采集问题
- 12. 广播接收器没有通过服务接收意图
- 13. 广播接收器
- 14. 广播接收器
- 15. 运行将接收SCREEN_ON服务广播
- 16. 接收服务中的广播
- 17. 广播接收机或服务?
- 18. Android:广播接收器和后台服务
- 19. Android:广播接收器和服务问题
- 20. 使用AlarmManager和广播接收器启动Android服务
- 21. 广播接收器和服务之间的关系
- 22. 启动活动和服务从广播接收器
- 23. 我AlarmManager,广播接收器和服务没有启动,
- 24. Android中的广播接收器和服务
- 25. 广播接收器和服务之间的通信
- 26. 广播接收器的问题,注册的广播接收器
- 27. 广播接收器的的onReceive()未能接收由另一广播接收器
- 28. 从服务的互联网连接的广播接收器
- 29. 广播服务器
- 30. 接收来自广播接收器的广播意图错误
对于第一部分,我的意思是我会收到来自C2DM的意图,我猜你可以在设备处于睡眠状态时收到它。然后我想运行一个服务,我想我必须让wakelock保持运行。这些假设是否正确? – Jimmy 2011-04-15 19:15:56
@Fevos:“我的意思是我会收到C2DM的意图,我想你可以在设备睡着的时候收到它。” - 是的,C2DM通过无线数据(AFAIK)使用套接字连接,并且该连接上的传入数据包将简短*唤醒设备。 “然后我想运行一项服务,我想我必须让wakelock继续运行,这些假设是正确的吗?” - 是的,你会想要自己的'WakeLock'。只要确保完成后即可发布。 – CommonsWare 2011-04-15 19:20:41
太棒了!谢谢。 – Jimmy 2011-04-15 19:26:35