在Android 5.1中每秒调度一次闹钟

我想在我的应用程序中每秒运行一次报警服务。它在5.1版本以下工作正常。 但在5.1设备中不会触发。 我正在使用commonsware清醒的意图服务。logcat消息是说“ 可疑短间隔1000毫秒;扩展到60秒 ”。 我怎样才能轮询5.1的每一秒? 有人可以build议我怎么做到这一点?

更多的解释:

我的用例是我需要每隔30分钟进行一次操作。 AFAIK对于这个使用报警pipe理器是有效的方式,但在这里

1)我需要向用户显示倒数计时器。 (定时器任务,倒数计时器,ScheduledExecutorService对此非常有用)
2)即使应用程序在后台,我也需要每隔30分钟(通过通知)通知用户(警报服务就足够了)

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

谢谢,
切塔尼亚

Solutions Collecting From Web of "在Android 5.1中每秒调度一次闹钟"

这是Android棒棒糖的正常行为。

可疑短时间间隔1000毫秒; 扩大到60秒

告诉你系统不再喜欢那么短的时间间隔。

问题#161244记载:

这是按预期工作的,虽然目前还没有充分的文件logging(我们也知道这个问题的一面)。

一般而言:短期和近期的警报在电池中惊人地昂贵; 需要短期或近期工作的应用程序应使用其他机制来安排其活动。

所以不要为此使用AlarmService 。 喜欢一个线程或ExecutorsTimerTask或其他:

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

为什么要这么做?
改用一个处理程序:

 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分钟提醒用户

  • 如果您需要显示更新的活动位于前台, 那么还可以使用postDelayed()等便宜的操作来为用户定期提供更新

我不明白你的使用情况,但每秒设置警报是矫枉过正。 你可以使用Timer 。 看看这个class级。

这是Android 5.1的一个报告问题 ,只要您尝试设置小于60000毫秒的时间间隔的警报,就会发生这种情况。

发生此警告是因为设置非常低的时间间隔会使您的电池快速耗尽。

该平台上的项目成员说:

一般而言:短期和近期的警报在电池中惊人地昂贵; 需要短期或近期工作的应用程序应使用其他机制来安排其活动。

这就是为什么不build议在你的情况下使用Alarm

根据你的问题更新。 即使用户手动将其从最近的应用程序列表中移除,您也希望保持后台服务的清醒。 这可以通过使用START_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; } 

来源: 答案

尝试这些步骤。

  1. 1分钟后使用Alarmmaager定期
  2. 在该警报pipe理器内使用一个处理器,几秒钟后调用并执行您的任务。

记得

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

我已经成功地将最小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(hex中的60000ms / 1min)replace为希望最小时间间隔为30秒的很多毫秒0x7530

保存并返回到classes.dex

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

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

复制回/system/framework/services.jar

重新启动设备。

同样在我的三星设备上,软件包名称中包含警报或警报(未testing)字样,将其添加到白名单中。 当我这样做的时候,我的警报就被触发了。