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:
- 使用
以大于一分钟的间隔(例如请求的30分钟)向用户发出警报AlarmManager
- 如果通知触发了需要在前台显示更新的活动,那么还可以做一些便宜的事情,比如
,在该活动中定期向用户提供更新postdayed()
这不是一个好主意,因为警报管理器不知道设备的当前情况,例如,它不考虑设备是否连接到电源插头,空闲或连接到网络也会浪费资源,因为它不关心设备何时有更多可用资源。
我已成功将最小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你能帮我做些什么吗?如果即使设备处于休眠状态或应用程序处于休眠状态,任务也必须运行该怎么办