【问题标题】:Android DOZE mode GCM PriorityAndroid DOZE 模式 GCM 优先级
【发布时间】:2016-03-04 02:43:09
【问题描述】:

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

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

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

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

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

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

$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
);

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

测试方法

  1. 运行基于 GCM 的应用程序
  2. 通过从 adb shell (link) 发出命令来诱导打盹模式 $ adb shell dumpsys battery unplug $ adb shell dumpsys deviceidle step
  3. 从服务器发送消息 (phpfiddle)

预期行为:正常优先级 GCM 没有立即交付 观察到的行为:消息立即传递

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

【问题讨论】:

  • 您如何确认您的设备处于打盹模式?你在用these adb commands吗?
  • 您能否更新您的问题以包含您使用的 adb 命令?最好在您的问题中包含所有代码,以便在链接资源消失时仍然可以理解。
  • 在运行adb shell dumpsys deviceidle step 之后,您确定看到IDLE 吗?
  • 是的,以下是 adb shell dumpsys deviceidle 'mState=IDLE' 的输出
  • 是的@qblx 我确认使用 adb 命令

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


【解决方案1】:

我使用运行 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 和上面链接的说明发送测试消息,看看它是否会产生与您的服务器代码不同的行为。

【讨论】:

  • 嗨,是的,我的问题现在已经解决了。感谢您的建议,我有最新的 Play Services 库。但问题在于adb shell dumpsys deviceidle enable。我没有这样做。根据文档,我认为 unplug 和 step 就足够了。无论如何,现在我的问题已经解决了。非常感谢。
  • 这个AOSP issue 讨论了dumpsys deviceidle 命令的问题。在其中一个 cmets 中,一位 Google 工程师指出,较新的版本支持 dumpsys deviceidle force-idle。这适用于模拟器,似乎是进入打盹模式的最简单方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2012-11-17
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多