在Android 5.1中安排每秒的警报

时间:2015-04-28 08:53:52

标签: android alarmmanager android-wake-lock background-service


我想在我的应用程序中每秒运行一次报警服务。它在5.1版本以下工作正常。但它不会在5.1设备中触发。我正在使用commonsware wakeful intent service.logcat消息说“可疑短暂间隔1000毫秒;扩展到60秒”。如何在5.1中每秒轮询一次?任何人都可以建议我如何实现这个目标吗?

更多解释:

我的用例是我需要每隔30分钟做一些操作。 AFAIK为此使用报警管理器是有效的方法,但在这里

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

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

谢谢,
切塔尼亚

7 个答案:

答案 0 :(得分:6)

这是Android Lollipop中的正常行为。

  

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

告诉你系统不再喜欢这些短时间间隔了。

问题#161244记录了:

  

这是按预期工作的,虽然目前没有充分记录(我们已经知道问题的这一方面)。

     

非常普遍地说:短期和近期的警报在电池方面的成本非常高;需要短期或近期工作的应用应使用其他机制来安排其活动。

所以不要使用AlarmService。首选主题或ExecutorsTimerTask或其他内容:

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

// Using Executors
Executors.newSingleThreadScheduledExecutor().schedule(runnable, 1, TimeUnit.SECONDS);

答案 1 :(得分:3)

你为什么这样做?
改为使用处理程序:

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

答案 2 :(得分:1)

同时使用1 2:

  • 使用AlarmManager作为每30分钟提醒用户的角色

  • 如果您需要显示更新的活动位于前台,那么也会做一些便宜的事情,比如postDelayed(),用户定期更新该活动

答案 3 :(得分:0)

我不完全理解你的用例,但每秒设置闹钟都是过度的。您可以使用Timer。看看这堂课。

答案 4 :(得分:0)

这是针对Android 5.1报告的issue,只要您尝试将警报设置为小于60000毫秒的间隔,就会发生这种情况。

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

平台上的项目成员说:

  

非常普遍地讲:短期和近期的警报   电池价格惊人;需要短期或   近期的工作应该使用其他机制来安排他们的工作   活性。

这就是为什么不建议您使用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;
} 

来源:answer

答案 5 :(得分:0)

尝试这些步骤。

  1. 1分钟后使用Alarmmaager期刊
  2. 在警报管理器内部使用一个处理程序,该处理程序在几秒钟后调用并执行您的任务。
  3. 记住

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

答案 6 :(得分:-3)

我已成功将最小的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)替换为多少ms,您希望最小间隔为示例30秒0x7530

将and 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(未测试)会将其添加到白名单中。当我这样做时,我的警报就会被触发。