Android Studio使用Icon设置精确闹钟

时间:2016-09-21 12:57:04

标签: java android alarmmanager android-alarms

我正在尝试制作一个闹钟应用程序。目前我正在使用AlarmManager。我的minSdkVersion是API等级19。

问题是,我不能像其他应用程序那样得到准确的警报。例如,Playstore中的AlamDroid示例:当时钟切换到设置的时间时,它会在秒中触发警报。它也适用于API 19.

我的代码现在是:

 Calendar calendar = Calendar.getInstance();
 calendar.setTimeInMillis(System.currentTimeMillis());
 calendar.set(Calendar.HOUR_OF_DAY, hour);
 calendar.set(Calendar.MINUTE, minute);

 if (calendar.getTimeInMillis() < System.currentTimeMillis())
     calendar.add(Calendar.HOUR, 24);

 Intent myIntent = new Intent(context, AlarmReceiver.class);
 myIntent.putExtra(DB_ID, myID);
 pendingIntent = PendingIntent.getBroadcast(context, myID, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
 alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

问题是,在AlarmDroid中,我在API Levl 19上获得了一个位于Android状态栏上方的AlarmIcon。但是他是怎么做到的?因为alarmManager.setAlarmClock仅在API&gt; = 21时可用。而Icon只有这个!

但是,AlarmDroid的准确性在第二阶段是完美的!虽然我的情况更糟。除了AlarmManager还有其他方法吗?或者:我做错了什么?为什么我无法像PlayStore中的其他AlarmClock应用程序那样设置非常准确的警报。即使状态栏中有通知......

编辑:在AlarmDroid和其他警报应用程序中,在警报触发前一分钟内状态栏中有一个通知。这似乎就像每个AlarmApp都内置的内容一样!

EDIT2:Appstore中的其他警报怎么可能是准确的?

编辑 - &gt;可能的解决方案:

对于所有遇到同样问题的人,请查看此处:

Link to Stackoverflow Question - Answer from Paweł Nadolski / Mathieu H.

这可能是三星手机的解释/解决方案。他们似乎正在检查Pakagename中的关键字,如“闹钟”,“警报”,以使闹钟更准确!

2 个答案:

答案 0 :(得分:1)

你正面临这个问题,因为上面的API 18 android优化了警报,以尽可能少地唤醒手机,所以解决方案是使用setExact方法在API 19及以上和其他上面的精确性。

Api 19

alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);

所以它看起来像这样:

if(android.os.Build.VERSION.SDK_INT >=19){
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, time,pendingIntent );
}else{
   alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent)
}

您可能需要添加lint警告

来自docs

从API 19(KITKAT)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。

你运气不好因为没有其他API选项可以使alaram完全正确

更新:似乎您错过了要设置的seconds字段,因此请尝试将seconds添加到您的日历中。

答案 1 :(得分:0)

我找到了解决方案,它甚至可以在三星设备上运行。如果仍然需要包含“alarm”的包名称,则不确定。但这不是问题,因为您可以创建一个额外的包。

如果您希望闹钟在秒钟上准确,只需将秒设置为0:

 Calendar calendar = Calendar.getInstance();
 calendar.setTimeInMillis(System.currentTimeMillis());
 calendar.set(Calendar.HOUR_OF_DAY, hour);
 calendar.set(Calendar.MINUTE, minute);
 calendar.set(Calendar.SECOND, 0); // This part will solve the Problem!
是的,这解决了我的问题!