报警管理器示例
我想在我的项目中实现计划功能。所以我在谷歌上搜索了一个警报管理器程序,但我找不到任何示例。
谁能帮我设计一个基本的警报管理程序?
I want to implement a schedule function in my project. So I Googled for an Alarm manager program but I can`t find any examples.
Can anyone help me with a basic alarm manager program?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
此代码将帮助您发出重复警报。重复时间可以由您设置。
Activity_main.xml
MainActivity.java
如果您只需要一次警报,则替换
为
This code will help you to make a repeating alarm. The repeating time can set by you.
activity_main.xml
MainActivity.java
If you need alarm only for a single time then replace
with
我已经自己实现了以尽可能最简单的方式做到这一点。
唯一的下一步,就是实施它。
我喜欢使用此实现,但另一种可能的好方法是,不要将
AbstractSystemServiceTask
类抽象化,而是通过构建器构建它。我希望它对你有帮助。
已更新
进行了改进,允许在同一个
BroadCastReceiver
上使用多个BackgroundTaskListener
。I have made my own implementation to do this on the simplest way as possible.
The only next step, implement it.
I like to work with this implementation, but another possible good way, it's don't make the
AbstractSystemServiceTask
class abstract, and build it through a Builder.I hope it help you.
UPDATED
Improved to allow several
BackgroundTaskListener
on the sameBroadCastReceiver
.以下是使用 Kotlin 的警报管理器的示例:
Here's an example with Alarm Manager using Kotlin:
我也遇到了 Android 闹钟问题。问题在于打瞌睡模式(https://developer.android. com/training/monitoring-device-state/doze-standby)。例如,当我将闹钟再设置为一小时时,闹钟工作正常,但如果设置为凌晨 4 点,闹钟就不起作用了。我刚刚发现它非常简单,我应该使用 AlarmManager.setAlarmClock() 而不是 AlarmManager.set() 。
所以我决定在 github 上创建一个示例应用程序。
https://github.com/carlosabreu/androidalarm
I was having a problem with alarms in Android too. The problem was about the doze mode (https://developer.android.com/training/monitoring-device-state/doze-standby). For example, the alarm worked fine when I set it to one hour further, but it didn't work if it was set to 4am. I just discovered it is very simple, I just should use AlarmManager.setAlarmClock() instead of AlarmManager.set().
So I decided to create an example application on github.
https://github.com/carlosabreu/androidalarm
这是工作代码。它每 10 分钟唤醒一次 CPU,直到手机关闭。
添加到 Manifest.xml:
类中的代码:
从服务设置闹钟:
如果要设置闹钟重复时间手机启动时间:
将权限和服务添加到Manifest.xml:
并创建一个新类:
This is working code. It wakes CPU every 10 minutes until the phone turns off.
Add to Manifest.xml:
Code in your class:
Set Alarm from Service:
If you want to set alarm repeating at phone boot time:
Add permission and the service to Manifest.xml:
And create a new class:
我尝试了 XXX 的解决方案,虽然它最初工作正常,但在某些时候它停止工作。
onReceive
再也没有被调用过。我花了几个小时试图弄清楚它可能是什么。我开始意识到,出于某种神秘原因,Intent
不再被调用。为了解决这个问题,我发现您确实需要在清单中为接收者指定一个操作。示例:请注意,名称为带有句点的
".Alarm"
。在 XXX 的setAlarm
方法中,创建Intent
,如下所示:START_ALARM
消息可以是您想要的任何内容。我只是出于演示目的才给它起这个名字。我还没有看到清单中定义的接收器没有指定操作的意图过滤器。按照 XXX 指定的方式创建它们似乎有点假。通过指定操作名称,Android 将被迫使用与该操作对应的类创建
BroadcastReceiver
的实例。如果您依赖上下文,请注意 Android 有几个不同的对象,这些对象都称为上下文,并且可能不会导致您的BroadcastReceiver
创建。强制 Android 仅使用操作消息创建类的实例比依赖某些可能永远无法工作的不确定上下文要好得多。I tried the solution from XXX and while it did initially work, at some point it stopped working. The
onReceive
never got called again. I spent hours trying to figure out what it could be. What I came to realize is that theIntent
for whatever mysterious reason was no longer being called. To get around this, I discovered that you really do need to specify an action for the receiver in the manifest. Example:Note that the name is
".Alarm"
with the period. In XXX'ssetAlarm
method, create theIntent
as follows:The
START_ALARM
message can be whatever you want it to be. I just gave it that name for demonstration purposes.I have not seen receivers defined in the manifest without an intent filter that specifies the action. Creating them the way XXX has specified it seems kind of bogus. By specifying the action name, Android will be forced to create an instance of the
BroadcastReceiver
using the class that corresponds to the action. If you rely upon context, be aware that Android has several different objects that are ALL called context and may not result in getting yourBroadcastReceiver
created. Forcing Android to create an instance of your class using only the action message is far better than relying upon some iffy context that may never work.这是一个相当独立的示例。 5 秒后按钮会变成红色。
请记住,即使您的应用程序未运行,AlarmManager 也会触发。如果您调用此函数并点击“主页”按钮,等待 5 秒,然后返回到您的应用程序,该按钮将变成红色。
我不知道如果你的应用程序根本不在内存中,你会得到什么样的行为,所以要小心你试图保留什么样的状态。
Here's a fairly self-contained example. It turns a button red after 5sec.
Remember though that the AlarmManager fires even when your application is not running. If you call this function and hit the Home button, wait 5 sec, then go back into your app, the button will have turned red.
I don't know what kind of behavior you would get if your app isn't in memory at all, so be careful with what kind of state you try to preserve.
MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
•
AlarmManager
与IntentService
结合我认为使用
AlarmManager
的最佳模式是它与IntentService
的协作。IntentService
由AlarmManager
触发,并通过接收意图处理所需的操作。此结构不会像使用BroadcastReceiver
那样影响性能。我在 kotlin 中为这个想法开发了一个示例代码此处可用:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
用法:
如果您想取消预定的闹钟,试试这个:
•
AlarmManager
in combination withIntentService
I think the best pattern for using
AlarmManager
is its collaboration with anIntentService
. TheIntentService
is triggered by theAlarmManager
and it handles the required actions through the receiving intent. This structure has not performance impact like usingBroadcastReceiver
. I have developed a sample code for this idea in kotlin which is available here:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
Usage:
If you want to to cancel the scheduled alarm, try this:
警报管理器:
添加到 XML 布局(*在主活动中创建时初始化这些视图)
添加到清单(在应用程序标记内部和外部活动)
创建 AlarmBroadcastManager 类(从 BroadcastReceiver 继承)
在主活动中(添加这些功能):
Alarm Manager:
Add To XML Layout (*init these view on create in main activity)
Add To Manifest (Inside application tag && outside activity)
Create AlarmBroadcastManager Class(inherit it from BroadcastReceiver)
In Main Activity (Add these Functions):