我开发了一个设备管理应用,可以将策略应用到设备,例如限制等。
我的系统如何运作
webapp通过FCM向设备发送推送通知。我以前使用GCM和唤醒锁(后者工作正常)。当推送通知到达设备时,接收推送的firebase类会调用IntentService。然后,此IntentService处理消息,例如" MOBILEDATA_ON"以及与该消息相关的任何数据。一旦处理了消息,例如MOBILEDATA_ON,该服务就会执行打开移动数据的代码,然后调用将状态转发回webapp的Web服务。
我选择了IntentService,因为它是Async,能够进行http调用以回送状态而不需要额外的异步代码。
当设备处于唤醒状态时,所有这一切都可以正常工作,即使应用程序在后台也是如此。
问题
如果设备已拔下并且未触摸一段时间,则会进入打盹/待机模式。 (这是一款Android 6设备)。这是正常行为,但是如果我向设备发送推送,设备会接收它并执行正确的代码以应用功能,但遗憾的是,未执行中继设备新状态的网络连接。
因此,例如,如果我的设备上的蓝牙已关闭且处于打盹模式,我可以发送成功切换蓝牙的推送,但是webapp永远不会收到更新的状态。
我在发送推送时已将FCM的优先级设置为高,这就是为什么我在设备处于Doze时接收推送的原因。
我的应用是设备管理应用,文档说
该应用是一个有效的设备管理应用(例如,设备政策 控制器)。虽然它们一般在后台运行,但设备 管理员应用永远不会进入App Standby,因为它们必须保持可用状 随时从服务器接收策略。
任何人都可以告诉我为什么在处于打盹/待机模式时,网络连接没有执行将状态发送回服务器?
[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");
}
感谢
马特