Android DOZE模式GCM优先级

时间:2015-11-30 12:46:20

标签: android google-cloud-messaging android-6.0-marshmallow android-doze

对于DOZE模式测试,我正在Android 6.0上开发一个示例GCM应用程序。

如上所述,在DOZE模式下,设备不会为正常优先级GCM唤醒。我想检查一下。

根据文档(https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message

  

正常优先。这是邮件传递的默认优先级。普通优先级消息不会打开睡眠设备上的网络连接,并且可能会延迟它们的传送以节省电池电量。对于时间敏感度较低的消息,例如新电子邮件或其他要同步的数据的通知,请选择正常的投放优先级。

我使用此链接中的一些服务器代码测试了我的应用。 https://stackoverflow.com/a/22169411/4242382

我从服务器发送的消息是这样的:

alpha[2][8]

如您所见,没有设置优先级,所以在DOZE模式下我不应该立即得到这个。但是设备仍然会立即收到GCM消息。

测试方法

  1. 运行基于GCM的应用
  2. 通过从adb shell发出命令来诱导DOZE模式(link$msg = array ( 'message' => 'here is a message. message', 'title' => 'This is a title. title', 'subtitle' => 'This is a subtitle. subtitle', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1 );
  3. 从服务器发送消息(phpfiddle)
  4. 预期行为:普通优先级GCM没有立即交付 观察到的行为:立即传递消息

    DOZE模式是否按照文档工作?我没有看到它发生,任何人都面临同样的情况?

1 个答案:

答案 0 :(得分:2)

我使用运行API 23的模拟器测试了非优先级GCM消息传递,并观察了记录的行为:当模拟设备处于打盹模式时,消息未传递。退出打盹模式几秒钟后,收到了消息。

我的测试应用是使用Goggle Play Services 8.3.0构建的。 API 23的模拟器映像包含较旧版本的Play服务,当应用程序初始化为更新为8.3.0时会发出警告。我不知道如何在模拟器上执行此操作。该应用程序已成功注册并收到消息,因此我继续进行测试。

我将模拟设备置于打盹模式:

$ adb shell dumpsys deviceidle enable

并重复:

$ adb shell dumpsys deviceidle step

我按照provided here的说明使用curl发送了邮件。通过观察logcat输出确认了邮件收据。

deviceidle step命令生成状态:IDLE_PENDING,SENSING,IDLE_MAINTENANCE和IDLE。对于IDLE以外的所有人,都会立即收到消息。未收到IDLE时发送的消息。等待大约一分钟后,deviceidle step用于进入IDLE_MAINTENACE状态。在几秒钟内,保留的信息已经发送。

两个建议:

  1. 如果您不使用Play Services 8.3.0构建,请更新到该版本。
  2. 使用curl和上面链接的说明发送测试消息,看看是否会产生与服务器代码不同的行为。