Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FCM在Android Doze模式下提供推送通知,但不进行网络呼叫_Android_Http_Firebase Cloud Messaging - Fatal编程技术网

FCM在Android Doze模式下提供推送通知,但不进行网络呼叫

FCM在Android Doze模式下提供推送通知,但不进行网络呼叫,android,http,firebase-cloud-messaging,Android,Http,Firebase Cloud Messaging,我已经开发了一个设备管理应用程序,将策略应用于设备,如限制等 我的系统如何工作 webapp通过FCM向设备发送推送通知。我曾经使用GCM和wakelock(后者工作得很好)。当推送通知到达设备时,接收推送的firebase类调用IntentService。然后,此IntentService将处理消息(如“MOBILEDATA__ON”)以及与该消息相关的任何数据。一旦消息被处理完毕,例如MOBILEDATA_ON,服务就会执行代码,打开移动数据,然后调用一个webservice,将状态转发回w

我已经开发了一个设备管理应用程序,将策略应用于设备,如限制等

我的系统如何工作

webapp通过FCM向设备发送推送通知。我曾经使用GCM和wakelock(后者工作得很好)。当推送通知到达设备时,接收推送的firebase类调用IntentService。然后,此IntentService将处理消息(如“MOBILEDATA__ON”)以及与该消息相关的任何数据。一旦消息被处理完毕,例如MOBILEDATA_ON,服务就会执行代码,打开移动数据,然后调用一个webservice,将状态转发回webapp

我选择IntentService是因为它是异步的,并且能够进行http调用来中继状态,而无需额外的异步代码

当设备处于唤醒状态时,所有这些都可以正常工作,即使应用程序位于后台

问题

如果设备拔下插头并保持一段时间不动,它将进入打瞌睡/待机模式。(这是一款安卓6设备)。这是正常行为,但是,如果我向设备发送推送,设备确实会接收推送并执行正确的代码以应用功能,但不幸的是,没有执行中继设备新状态的webcall

因此,例如,如果我的设备上的蓝牙已关闭且处于睡眠模式,我可以发送一个推送,该推送成功地打开了蓝牙,但webapp从未收到更新状态

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

“我的应用程序是一个设备管理应用程序,”文档说

该应用程序是活动的设备管理应用程序(例如,设备策略) 控制器)。虽然它们通常在后台运行,但设备 管理员应用程序从不进入应用程序待机状态,因为它们必须保持可用状态 随时从服务器接收策略

有人能告诉我为什么在打瞌睡/待机模式下网络调用没有执行并将状态发送回服务器吗

[第1版]

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

问题是,GPS可能需要20秒才能找到一个锁,在这个时候,最初的Intentservice已经完成,设备又回到了睡眠状态

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

部分唤醒锁似乎无法按预期工作,因此我发现以下代码使用了完全唤醒锁。不过,这是不可取的。是使用完全唤醒锁定的替代方案吗

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

}
谢谢


马特

您的intentservice是否有唤醒锁?否则,在发送http请求之前,设备可能会重新进入睡眠状态。@Okas No,在使用GCM时通常是这样,但对于firebase,我认为它给了您10秒的窗口。我知道这个窗口是为了获得更多的wakelocks,但我认为这已经足够了。我应该在intentService中使用wakelock吗?@Okas我可以用startWakefulService而不是startService启动intentService吗?为什么不尝试一下,让我们都知道你发现了什么。@Okas好的,我找到了以下链接。我今晚晚些时候再试试。