- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
服务总是可以被操作系统关闭。因此,它们对我来说似乎不如 AlarmManager 可靠。我必须每 1-2 秒进行一次定期更新。在服务或 AlarmManager 中使用后台线程更好吗?由于有多种方法可以在不唤醒应用程序的情况下使用 AlarmManager。参见 http://vikinghammer.com/2012/04/22/android-use-alarmmanager-instead-of-a-service-with-a-timertask/
我想知道所有 Timer、Thread 和 Service 代码有什么优势?我反对 AlarmManager 的一个想法是任务代码必须在某处执行,因此在接收到它时,BroadcastReceiver 似乎是执行代码的错误位置。传递给 IntentService 怎么样?这比正在运行的后台服务中的所有线程管理的开销更高吗?如果没有AlarmManager,我们如何保证后台服务真正保持运行?
澄清一下,我的应用程序将在后台运行,而其他应用程序则允许用户运行。我会阻止其中一些,但让其他人运行很长时间。因此,我不认为服务每 2 秒检查一次,就可以保证在用户使用其他应用程序时它会一直存在。但如果报警管理器,我能保证检查总是正确的吗?
最佳答案
我不确定,但据我所知,我分享我的观点。如果我错了,我总是接受最佳答案。
报警管理器
只要警报接收器的 onReceive() 方法正在执行,警报管理器就会持有 CPU 唤醒锁。这保证了在您处理完广播之前手机不会休眠。一旦 onReceive() 返回,Alarm Manager 释放这个唤醒锁。这意味着手机在某些情况下会在您的 onReceive() 方法完成后立即休眠。如果您的警报接收器调用了 Context.startService(),则电话可能会在请求的服务启动之前进入休眠状态。为防止这种情况,您的 BroadcastReceiver 和服务将需要实现单独的唤醒锁定策略,以确保手机继续运行直到服务可用。
注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。对于正常的计时操作(滴答、超时等),使用 Handler 更容易、更高效。
计时器
定时器 = 新定时器();
timer.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
\\ here your todo;
}
}}, 60000, 60000);
Timer 有一些缺点,已被 ScheduledThreadPoolExecutor 解决。所以这不是最好的选择
调度线程池执行器。
您可以使用 java.util.Timer 或 ScheduledThreadPoolExecutor(首选)安排一个 Action 在后台线程上定期发生。
这是使用后者的示例:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);
所以我更喜欢ScheduledExecutorService
但是还要考虑一下,如果更新将在您的应用程序运行时发生,您可以使用定时器,如其他答案中所建议的,或更新的 ScheduledThreadPoolExecutor。如果您的应用程序即使在未运行时也会更新,您应该使用 AlarmManager。
警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。请注意,如果您计划在关闭应用程序时进行更新,则每十分钟一次的频率非常高,因此可能有点太耗电了。
关于android - AlarmManager 而不是后台服务?对于重复的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835457/
我想在每次触发 AlarmManager 时额外更改 Intent。这可能吗,我如何在 AlarmManager 触发后立即调用它? 代码: public void startCollector(){
public class AlarmManagerClass extends BroadcastReceiver { public static boolean haveInternet
我正在寻找执行简单任务的最有效方法。作为一名新的 android 开发人员,我不太确定这些策略中的哪一个在内存效率方面最适合我的应用程序。我想其中一些方法可能会导致我不知道的线程问题。 所有三个解决方
我的应用程序有一个实时模块,它应该每 60 秒 ping 服务器一次。否则,连接将断开,设备将需要重新连接。 第一次尝试是使用 Thread.Sleep 使 ping 线程以所需的频率运行。第二次尝试
我有一组在重启后需要保留的警报。我试过在启动接收器上使用,但它们不会重新启动。我不确定我是否了解启动接收器以及如何重新启动所有警报。我已经有一个接收器来接收我的通知,但不知道我是否可以使用同一个接收器
我有一个要在其中创建警报的 Android 应用程序。这是一个正常的闹钟,应该在指定的时间叫醒你。与任何警报一样,您还可以通过在创建警报时选择声音文件来指定它将使用哪种警报声音。 闹钟效果很好,它在正
我的任务是定期读取后端的手机传感器(例如 WiFi、加速度计)。 我目前的解决方案是使用 AlarmManager。 具体来说,我们有: 在“主”程序(一个 Activity )中,我们使用 Pend
public void SetAlarm(Context context, int sec) { AlarmManager am=(AlarmManager)context.getSyst
我已经通过警报管理器制作了简单的警报,问题是当插入很多秒时,它无法及时工作,这是我在这里声明的 这是代码 mo = ((Integer.parseInt(mons.getText().toStrin
我在应用程序中设置了一个闹钟,每 X 分钟触发一次通知。第一次有效,但随后就不重复了。 我正在开发的 API 是 API 18 (Android 4.3)。 MainActivity.class pu
我很难专心于对 AlarmManager 进行编程。 下面的代码几乎只是将当前日期分配给文本字段并获取一些 XML 并使用 setListAdapter 显示它。我希望这段代码在启动时运行,然后每 3
我对如何停止 AlarmManager 有疑问。我想在“x”小时开始并在“y”小时停止,由用户设置。我知道“.cancel”功能的存在,但不知道如何设置“y”小时内的停止时间。 创建时 final E
我的应用程序有一个 AlarmManager 设置为每 60 秒触发一次。它会触发一个 fragment ,该 fragment 检查当前时间并查找应用程序日历中当时是否有任何事件发生。它运行得很好,
我正在尝试安排使用 AlarmManager 调用的方法,但它似乎不起作用。我看过其他例子,但他们的例子不适合我。所以我认为这是我的代码中的一些内容。这是 AlarmManager 代码: Alarm
我将 AlarmManager 设置如下: Intent startIntent = new Intent(context, MyService.class); PendingIntent pend
我正在尝试使用警报管理器发出警报。应用程序运行时没有任何错误消息,但没有任何反应。 我尝试了来自developer.android.com的解决方案和来自stackoverflow的建议。我也尝试复制
public class background_alarm extends BroadcastReceiver { @Override public void onReceive(Context co
我编写了一个每天凌晨 5:22 运行的闹钟代码。该代码在第一个时间间隔内运行良好,但在第二个时间间隔内会在 24 小时之前触发。 我在 MainActivity 的 onCreate() 方法中添加了
我在这些类(class)中有两个类(class),A,B。他们两个我都有一个像下一个这样的警报管理器; class A{ PendingIntent sender; AlarmManager am
我在 9:00 和 21:00 有两个 AlarmManager,但只运行第二个闹钟。 ////////9:00am///////// Intent aviso = new Inten
我是一名优秀的程序员,十分优秀!