Android,如果设备处于深度睡眠模式,在接收来自GCM的消息时使用/don唤醒锁,并希望在onReceive之外工作?
我正在开发一个应用程序,其中Android,如果设备处于深度睡眠模式,在接收来自GCM的消息时使用/don唤醒锁,并希望在onReceive之外工作?,android,locks,Android,Locks,我正在开发一个应用程序,其中 一种服务,它执行http请求并将数据写入数据库 清单中声明的侦听GCM消息的接收方 用代码声明的接收器(在服务中),用于与服务“对话” 每次我接收到GCM消息时,我都希望从意图中提取数据,并将其广播到服务。然后,服务将查询http服务器,获取响应并将数据插入数据库 现在,我担心,如果手机处于深度睡眠状态,手机将被唤醒,直到GCM onReceive执行,而不是直到我的服务开始工作。这是我的GCM接收器onReceive: @Override public voi
- 一种服务,它执行http请求并将数据写入数据库
- 清单中声明的侦听GCM消息的接收方
- 用代码声明的接收器(在服务中),用于与服务“对话”
@Override
public void onReceive(Context context, Intent intent) {
String url = extractUrl(intent.getExtras());
Intent serviceIntent = new Intent(context, MyService.class);
serviceIntent.setAction(MyService.ACTION_DO_WORK);
Bundle data = new Bundle();
data.putString(MyService.URL_KEY, url);
LocalBroadcastManager.getInstance(context).sendBroadcast(serviceIntent);
}
我觉得我必须使用CPU锁(如果我弄错了,请纠正我)
我应该在哪里获得部分唤醒锁?我应该在这里获得它,然后在他完成工作后,在我的服务中发布它吗?(在一个位置获取锁并在另一个位置释放锁是否安全)
谢谢
我应该在哪里获得部分唤醒锁
理想情况下,您可以让一些经过测试的代码通过使用或来实现这一点
在调用
onReceive()
的过程中,这两个人都将获得WakeLock
,并在您的IntentService
完成其工作时安排释放WakeLock
。我认为您是对的;这类似于接收来自的消息;它描述的正是您建议的策略,在您的服务做任何事情之前,使用该策略来保护自己免受手机睡眠的影响。嗨,马特,我遇到了一些问题,因为我不知道我是否应该在服务中获得锁。也许安卓会在onReceive完成后尽快恢复睡眠,这样就永远不会向服务发送消息。如果是这样,我可能必须在GCM onReceive中获取锁,并在服务中释放它。尽管如此,我不知道这是否正确,也不知道该怎么做,因为您每次都会获得一个新的WakeLock实例。嗨,不幸的是,我的服务是由一个活动启动的,它将在后台运行(START_STCIKY)。因此,它不会从接收器启动。如您所见,接收者将向服务发送消息,仅此而已。在我这种情况下,如何确保服务在Android再次进入睡眠之前完成其工作?@user3030447:“如何确保服务在Android再次进入睡眠之前完成其工作”--听起来你一直在试图让服务运行,这是Android上的反模式。除此之外,如果您不喜欢WakefulIntentService
和WakefulBroadcastReceiver
,欢迎您检查他们的代码,看看他们如何处理WakeLock
,以便您确定如何最好地使其适应您的场景。WhatsApp使用正在运行的服务。。。我的意思是我看不出一直运行可重启服务有什么不对。。。我正在编写一个聊天客户端,顺便说一句:)不过,我想静态唤醒锁可以完成这项工作:)。谢谢你的密码。