android 5.1中的每秒定时报警

android 5.1中的每秒定时报警,android,alarmmanager,android-wake-lock,background-service,Android,Alarmmanager,Android Wake Lock,Background Service,我想在我的应用程序中每秒钟运行一次报警服务。它在5.1版本以下工作正常。但它在5.1设备中不会触发。我正在使用Commonware wakeful intent服务。logcat消息说“的间隔短得令人怀疑,为1000毫秒;扩展到60秒”。如何在5.1中每秒钟进行投票?有谁能建议我如何做到这一点吗 再解释一下: 我的用例是我需要每隔30分钟做一次操作。使用报警管理器是一种有效的方法,但是 1) 我需要向用户显示倒计时计时器。(计时器任务、倒计时、ScheduledExecutorService对此


我想在我的应用程序中每秒钟运行一次报警服务。它在5.1版本以下工作正常。但它在5.1设备中不会触发。我正在使用Commonware wakeful intent服务。logcat消息说“的间隔短得令人怀疑,为1000毫秒;扩展到60秒”。如何在5.1中每秒钟进行投票?有谁能建议我如何做到这一点吗

再解释一下:

我的用例是我需要每隔30分钟做一次操作。使用报警管理器是一种有效的方法,但是

1) 我需要向用户显示倒计时计时器。(计时器任务、倒计时、ScheduledExecutorService对此非常有用)
2) 即使应用程序在后台,我也需要每隔30分钟通知用户一次(通过通知)

但在这里,我的问题是当应用程序在后台时,当您从最近的应用程序中刷出应用程序时(即,应用程序进程被终止),没有任何服务或计时器、处理程序、执行器服务将无法工作)。在这种情况下,我如何在完成30分钟后通知用户。如果我想错了,请引导我

谢谢,

柴坦尼亚

我不太了解您的用例,但设置每秒钟一次的警报太过分了。你可以用。看看这个类。

这是Android棒棒糖的正常行为

可疑的短间隔1000毫秒;扩展到60秒

告诉您系统不再喜欢这些短时间间隔

问题记录如下:

虽然目前没有充分的文档记录(我们也意识到问题的这一方面),但这是按预期进行的

一般来说:短时间和不久的将来,报警器的电池成本惊人;需要短期或近期工作的应用程序应使用其他机制安排其活动。

因此,不要为此使用
AlarmService
。首选线程或
执行器
定时器任务
或其他:

// Using Handler
new Handler().postDelayed(runnable, TimeUnit.SECONDS.toMillis(1));

// Using Executors
Executors.newSingleThreadScheduledExecutor().schedule(runnable, 1, TimeUnit.SECONDS);
这是Android 5.1的一个报告,每当您尝试将报警设置为小于60000毫秒的间隔时,就会发生这种情况

之所以出现此警告,是因为设置如此低的间隔将很快耗尽电池电量

平台上的项目成员表示:

一般来说:短期和近期警报是 电池成本惊人;需要短时间或更长时间的应用程序 近期的工作应利用其他机制安排其工作 活动

这就是为什么不建议在您的情况下使用
报警

根据您的问题更新。即使用户从“最近使用的应用”列表中手动刷取后台服务,您也希望保持后台服务处于唤醒状态。这可以通过使用
START\u STICKY
标志(如下所示)简单地完成。在
onStartCommand
方法中将此代码添加到您的服务中:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
} 

来源:

你为什么要这样做
请改用处理程序:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // do your stuff here, called every second
        mHandler.postDelayed(this, 1000);
    }
};

// start it with:
mHandler.post(runnable);
并使用以下命令停止1秒计时器:

mHandler.removeCallbacks(runnable);
同时使用1和2:

  • 使用
    AlarmManager
    以大于一分钟的间隔(例如请求的30分钟)向用户发出警报

  • 如果通知触发了需要在前台显示更新的活动,那么还可以做一些便宜的事情,比如
    postdayed()
    ,在该活动中定期向用户提供更新

尝试以下步骤

  • 1分钟后使用Alarmmaager周期
  • 在报警管理器内部,使用一个处理程序,在几秒钟后调用并执行任务 记住


    这不是一个好主意,因为警报管理器不知道设备的当前情况,例如,它不考虑设备是否连接到电源插头,空闲或连接到网络也会浪费资源,因为它不关心设备何时有更多可用资源。

    我已成功将最小AlarmManager间隔从1分钟更改为30秒

    在设备上,将/system/framework/services.jar复制到计算机上。 从中提取classes.dex,例如使用Winrar打开

    下载baksmali

    java-jar baksmali.jar-o extractfolder classes.dex

    编辑extractfolder\com\android\server\AlarmManagerService$Constants.smali

    将所有值0xea60(60000ms/1min,十六进制)替换为希望最小间隔为30秒0x7530的毫秒数

    保存并Smali返回classes.dex

    java-Xmx512M-jar smali.jar extractfolder-o classes.dex

    在Winrar中再次打开services.jar,删除classes.dex并将新创建的classes.dex拖到services.jar中

    复制回/system/framework/services.jar

    重新启动设备


    同样在我的三星设备上,在软件包名称中添加单词alarm或alert(未测试)会将其添加到白名单中。当我这样做时,我的警报会准确地触发。

    使用TimerTask这是为这种需要而做的。检查我的更新答案我的问题有什么问题?我可以知道下一票背后的原因吗?我想他们下一票是因为logcat几乎说明了一切,但我认为这个问题没关系。在5.1设备中,你可以每秒从onReceive再次调用alarm。。它的工作就像一秒钟的计时器,当应用程序从最近的。。我面临着同样的问题,但这样我就能解决它…幸运的是@lazy ninja你能检查我更新的问题吗。并建议使用美沙酮。解决方案按预期工作。AlarmManager不能在准确的时间被解雇。谢谢您的建议。我也这么做了,它工作得和我预期的一样好。chaitu你能帮我做些什么吗?如果即使设备处于休眠状态或应用程序处于休眠状态,任务也必须运行该怎么办