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消息的接收方

  • 用代码声明的接收器(在服务中),用于与服务“对话”

每次我接收到GCM消息时,我都希望从意图中提取数据,并将其广播到服务。然后,服务将查询http服务器,获取响应并将数据插入数据库

现在,我担心,如果手机处于深度睡眠状态,手机将被唤醒,直到GCM onReceive执行,而不是直到我的服务开始工作。这是我的GCM接收器onReceive:

@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使用正在运行的服务。。。我的意思是我看不出一直运行可重启服务有什么不对。。。我正在编写一个聊天客户端,顺便说一句:)不过,我想静态唤醒锁可以完成这项工作:)。谢谢你的密码。