Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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
当应用程序关闭时,Android AlarmManager在某些设备上不工作_Android - Fatal编程技术网

当应用程序关闭时,Android AlarmManager在某些设备上不工作

当应用程序关闭时,Android AlarmManager在某些设备上不工作,android,Android,我正在尝试每隔半小时从AlarmManagersetRepeating()运行IntentService。我想发送一个广播,从广泛的演员到意图服务。在服务中,将完成一些功能 但是,最初,当应用程序处于关闭状态时,AlarmManager不会触发 当我的应用程序正在运行或处于后台状态时,警报正常工作;当我关闭应用程序时,警报在某些设备中不工作 即使应用程序已关闭,我应该如何运行警报?来自setRepeating()的文档: 从API 19开始,所有重复报警都是不精确的 此外,setRepeatin

我正在尝试每隔半小时从
AlarmManager
setRepeating()
运行
IntentService
。我想发送一个广播,从广泛的演员到意图服务。在服务中,将完成一些功能

但是,最初,当应用程序处于关闭状态时,
AlarmManager
不会触发

当我的应用程序正在运行或处于后台状态时,警报正常工作;当我关闭应用程序时,警报在某些设备中不工作


即使应用程序已关闭,我应该如何运行警报?

来自
setRepeating()
的文档:

从API 19开始,所有重复报警都是不精确的

此外,
setRepeating()
不适用于

您应该使用精确的报警(根据设备的API级别,通过适当的
AlarmManager
方法设置):

每次开火都要重新安排

对于重新安排,您可以将原始触发时间添加到
意图中:

intent.putExtra(KEY_TRIGGER_TIME, triggerTime);
然后在
onReceive()
中检索此额外值,将所需的间隔添加到其中,并使用新值重新安排报警时间:

@Override
public void onReceive(Context context, Intent intent) {
    long triggerTime = intent
            .getLongExtra(KEY_TRIGGER_TIME, System.currentTimeMillis());

    // adding one day to the current trigger time
    triggerTime += TimeUnit.DAYS.toMillis(1);

    // set a new alarm using the new trigger time
    // ...
}

注:正如上面评论中提到的@Opiatefuchs,一些制造商(如小米或华为)可能会实施某些电池节电功能,这些功能可以防止警报触发,并且不能通过编程绕过。

如今,设备在电池功耗方面具有更高的安全性。默认情况下,设备将几乎所有应用程序都保持在省电模式。这意味着在某些设备中,你的后台工作(位置、报警管理器)一旦从应用程序中出来就无法工作。在其他设备中,后台任务在电池阈值限制(如13%)后无法工作。因此,你需要将你的应用程序从这个节电模式中移出,以便即使在后台也能顺利运行你的应用程序。在这两个制造商中实现该行为的方法是:

小米
  • 转到电池=>电源=>应用程序电池节电器=>选择您的应用程序并选择无限制(用于后台设置),然后选择允许后台位置选项

  • 要在启动后自动启动应用程序,请转到安全应用程序=>权限=>自动启动并检查应用程序

三星 三星Smart Manager应用程序用于在3天后停止所有后台工作,如果您不使用应用程序。因此,禁用此功能的方法是:

  • 在设置=>无监控应用=>将您的应用添加到白名单中,转到电池。其他一些三星版本可能会在不同的地方禁用它,比如电池=>Detail=>选择应用程序和“不要优化”

对于其他设备,应在设置选项中直接提供相同的电源选项,或者提供一些应用程序来处理电源选项。

对于联想手机:-

您需要进入设置->应用->选择应用->取消选择限制以启动


现在,它将在后台工作,作为已终止状态

完全充电后,以下行为发生变化。以前,在禁用此应用程序的节能功能后,它显示没有激活电池节能等功能,但只有在充满电后(电池电量非常低的状态下),设备才会正常工作。因此,请更改应用程序的设置,然后进行完全充电(可能只有在之前电池电量不足的情况下)。这可以解决它


中兴通讯刀片L110
即使禁用了电池节电器(设置->电池->选项->电池节电器)和标记为消息重要的应用程序(设置->提示和通知->应用程序通知->应用程序名称->优先级),它似乎既没有也没有按时触发。

首先,android studio存在一个bug。如果您从android studio启动应用程序,然后将其从最近的应用程序中刷走,警报将被删除。因此,在那之后,通过点击启动器图标重新启动你的应用程序,然后如果你把它刷走,警报仍然会在那里

其次,在一些具有电池优化功能的设备上,您应该启动一个前台服务,这样做完全可以


我可以用这两点让它工作,现在它工作起来很有魅力。

请注意,user13的答案绝对正确,但有些设备(如华为)也实施了自己的能源管理,您无法通过编程方式摆脱这一问题。在我的华为Ascend Mate 7中,无论我在做什么(开发者指南对瞌睡模式的建议),它都不起作用。相反,我必须做一些设备设置,这只能手动进行…@Opiatefuchs:你能详细说明一下吗?(在我的LTE刀片中,即使手动警告和电池节电设置也没有帮助,但可能还有更多?@serv inc:嗯,很难说,有这么多不同的实现方式。我希望这将是独特的,在未来或更好地解释和更用户友好。在华为,也有自动启动设置。我在“电话管理器”中找到了这些设置。为什么?亲爱的制造商,您的手机被大量使用/销售是因为我们的努力,而不是因为您的应用程序正在被您的用户使用,您让我们很难应对这种情况。如果谷歌没有对制造商强加的这些愚蠢的限制采取任何行动,那么我们很快就会转向苹果生态系统。即使我在接收器中添加了一个,但循环是在警报时启动的。为什么?e、 g通知一个接一个地重复。我面临着同样的问题。就我而言,我停止了应用程序的电池优化,但在关闭应用程序后,它似乎根本无法触发我的广播接收器。在这种情况下,请分享你的想法。我在Pixel 4XL os:11中面对这个问题。谢谢!我注意到了你描述的臭虫行为,这让我发疯。我原以为我的代码出了问题,但现在它是有道理的。那么,有没有办法绕过这个,我的意思是甚至w
@Override
public void onReceive(Context context, Intent intent) {
    long triggerTime = intent
            .getLongExtra(KEY_TRIGGER_TIME, System.currentTimeMillis());

    // adding one day to the current trigger time
    triggerTime += TimeUnit.DAYS.toMillis(1);

    // set a new alarm using the new trigger time
    // ...
}