Android Studio设置带有图标的精确闹钟

6
我正在尝试制作一个闹钟应用程序。目前我正在使用AlarmManager。我的minSdkVersion是API Level 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 Level 19上获得了Android状态栏中的AlarmIcon。但他是如何做到的呢?因为alarmManager.setAlarmClock仅适用于API >= 21。并且这个图标只有一个!但是,在AlarmDroid中,准确度每秒钟都是完美的!而我的更糟糕。除了AlarmManager之外还有其他方法吗?或者:我做错了什么?为什么我不能像PlayStore中的其他闹钟应用程序一样设置非常精确的闹钟。即使在状态栏中也有通知...编辑:在AlarmDroid和其他闹钟应用程序上,闹钟触发前一分钟会在状态栏中显示通知。这似乎是内置的,因为每个AlarmApp都有它!编辑2:其他应用商店中的闹钟如何能够精确?编辑->可能的解决方案:对于所有遇到相同问题的人,请看看这里:Stackoverflow问题链接-来自Paweł Nadolski / Mathieu H.的答案

这可能是三星手机的一种解释/解决方案。似乎他们正在检查包名中的关键字,例如“alarm”、“alert”,以使闹钟更加准确!


请尝试更新部分。 - Pavneet_Singh
2个回答

1
您面临此问题是因为在API 18以上,安卓会尽可能减少闹钟唤醒手机的次数,解决方法是在API 19及以上版本中使用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警告
来自文档
从API 19(KITKAT)开始,闹钟传递是不精确的:操作系统会移动闹钟以最小化唤醒和电池使用。有新的API支持需要严格传递保证的应用程序;请参见setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。
在这里你运气不好,因为没有其他API选项可以使alaram变得精确。
更新:看起来你错过了设置字段的机会,所以也要在你的日历中添加

我正在使用手机,无法添加文档链接和进行适当的格式设置,请避免这些,并且如果有人能够进行格式设置,那将是非常好的。谢谢。 - Pavneet_Singh
我尝试过这个,但仍然存在问题:它不够精确,并且没有像.setAlarmClock那样在状态栏中通知。闹钟在设定的时间后大约30到50秒才会响起。 - MindCode
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - MindCode
那么,其他像“AlarmDroid”这样的闹钟应用程序是如何做到这一点的呢? - MindCode
是的,我已经在19和21上测试过了,两者都与AlarmDroid应用程序完全一致。 - MindCode
显示剩余3条评论

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!

就是这样,解决了我的问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接