FCM在Android Doze模式下提供推送通知,但没有进行网络直播

时间:2018-01-18 16:11:37

标签: android http firebase-cloud-messaging

我开发了一个设备管理应用,可以将策略应用到设备,例如限制等。

我的系统如何运作

webapp通过FCM向设备发送推送通知。我以前使用GCM和唤醒锁(后者工作正常)。当推送通知到达设备时,接收推送的firebase类会调用IntentService。然后,此IntentService处理消息,例如" MOBILEDATA_ON"以及与该消息相关的任何数据。一旦处理了消息,例如MOBILEDATA_ON,该服务就会执行打开移动数据的代码,然后调用将状态转发回webapp的Web服务。

我选择了IntentService,因为它是Async,能够进行http调用以回送状态而不需要额外的异步代码。

当设备处于唤醒状态时,所有这一切都可以正常工作,即使应用程序在后台也是如此。

问题

如果设备已拔下并且未触摸一段时间,则会进入打盹/待机模式。 (这是一款Android 6设备)。这是正常行为,但是如果我向设备发送推送,设备会接收它并执行正确的代码以应用功能,但遗憾的是,未执行中继设备新状态的网络连接。

因此,例如,如果我的设备上的蓝牙已关闭且处于打盹模式,我可以发送成功切换蓝牙的推送,但是webapp永远不会收到更新的状态。

我在发送推送时已将FCM的优先级设置为高,这就是为什么我在设备处于Doze时接收推送的原因。

我的应用是设备管理应用,文档说

  

该应用是一个有效的设备管理应用(例如,设备政策   控制器)。虽然它们一般在后台运行,但设备   管理员应用永远不会进入App Standby,因为它们必须保持可用状   随时从服务器接收策略。

Optimizing for doze

任何人都可以告诉我为什么在处于打盹/待机模式时,网络连接没有执行将状态发送回服务器?

[EDIT1]

我使用以下代码创建了一个唤醒锁。起初我获得了IntentService中的锁,执行了该功能,然后在同一服务中释放了它。这对大多数情况都有好处,但我的一些功能包括通过另一个名为跟踪服务的IntentService查找设备位置。

问题是GPS可能需要20秒才能找到原始Intentservice完成并且设备重新进入睡眠状态的锁定。

为了解决这个问题,我在应用程序对象中创建了2个方法来获取和释放锁。这样,如果推送是针对位置的,我可以检查初始服务(通常是释放它)以查看推送是否是位置而不是在那里释放。相反,跟踪服务可以在找到GPS时调用应用程序对象以释放。

部分唤醒锁似乎没有按预期工作,因此我发现以下代码使用完整的唤醒锁。虽然这很难过是否使用FULL_WAKE_LOCK?

public void acquireWakeLock(){


    wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
            "MyWakelockTag");
    wakeLock.acquire();
    Log.e(TAG, "just acquired wakelock");

}


public void releaseWakeLock(){

    wakeLock.release();
    Log.e(TAG, "just released wakelock");

}

感谢

马特

0 个答案:

没有答案