这个问题在这里已有答案:
我有一个AlarmManager,每X分钟触发一次警报 .
当警报触发时,我正在做一些操作,比如读取一个小文件并更新SharedPreferences .
在这种情况下,建议用于这些操作的是什么?
服务似乎很合适,但由于这些操作相对较短,因此BroadcastReceiver可能更好(更轻?)?
似乎BroadcastReceiver和Service都在相同的进程和UI线程上运行,唯一的区别是Android如何以及何时杀死它们 . 那是对的吗?
据我所知,AlarmManger可以调用Receiver或Service(或者一个Activity,但现在不相关) . 即使我的应用程序没有运行,我的警报也会一直运行 . 因此,如果我的应用程序没有运行,无论哪种方式(服务或广播接收器)都将启动我的进程 . 警报每10秒钟就会熄灭,这取决于用户 . 因此,在这种情况下,IntentService必须每10秒启动一个线程 . 这个系统不是那么“苛刻”吗?谢谢 .
2 回答
如果您已经在使用AlarmManager,那么在任何Activity(或Fragment)都有代码的情况下使用BroadcastReceiver来执行您提到的操作 . 请记住,要么在UI线程上运行,要么使用AsyncTask或Thread .
您不需要运行服务,因为AlarmManager将触发您的警报 . 无需为此生成新进程(服务) .
您可以从另一个角度(如果您使用服务)通过不使用AlarmManager并每隔X分钟发布一个Runnable来解决问题,但第一种方法应该没问题 .
UPDATE :
也许你误解了我 . 服务可以在不同的进程中运行(虽然默认情况下不会这样做),但它与BroadcastReceiver不同 . 如果您使用的是AlarmManager,则无需运行服务 .
Service和BroadcastReceiver之间的区别通常是新Android开发者之间的混淆 .
如果不了解每X分钟需要执行的工作的性质,很难说出最佳方案是什么 .
只要您了解运行服务(在其不同模式下)和/或如何不阻止UI线程的后果,那么使用服务通常是好的,即使是IntentService也可以帮助您 .
也许你想把你的AlarmManager与IntentService结合起来,但要注意这并不妨碍设备进入睡眠状态,你也可以使用WakefulIntentService为你保留一个唤醒锁 .
广播接收器(短接收器)是一个Android组件,允许您注册系统或应用程序事件 . 一旦发生此事件,Android运行时会通知所有已注册的事件接收器!是的你可以使用它