我是初学者,我正在开发一个Android应用程序,它将在一定延迟(以天为单位)后继续向用户发送短信。我希望用户一旦注册就应该收到短信而不管这个事实是什么他是否登录。从数据库中提取短信内容和手机号码。经过研究,我发现了两种方式
ScheduledExecutorService的
AlarmManager
问题是当手机关机或重启时,alarmManager将关闭。 ScheduledExecutorService也是这种情况吗?在使用Executor服务时,我应该在ThreadPool中使用多少个线程?
答案 0 :(得分:9)
警报管理器
只要警报接收器的onReceive()
方法正在执行,警报管理器就会保持CPU唤醒锁定。这可以保证在您完成广播处理之后手机不会睡眠。一旦onReceive()
返回,警报管理器就会释放此唤醒锁定。这意味着在onReceive()
方法完成后,手机在某些情况下会立即进入睡眠状态。如果您的警报接收器呼叫Context.startService()
,则手机可能会在启动所请求的服务之前休眠。为防止这种情况发生,您的BroadcastReceiver
和服务需要实施单独的唤醒锁定策略,以确保手机继续运行,直到服务可用。
<强>的ScheduledThreadPoolExecutor。强>
您可以使用java.util.Timer or ScheduledThreadPoolExecutor
(首选)安排在后台线程上定期执行操作。
以下是使用后者的示例:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);
所以我更喜欢ScheduledExecutorService
但是,如果在应用程序运行时进行更新,则可以使用其他答案中建议的Timer或较新的ScheduledThreadPoolExecutor。如果您的应用程序即使在未运行时也会更新,您应该使用AlarmManager。
警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。
请注意,如果您计划在应用程序关闭时进行更新,则每十分钟一次是非常频繁的,因此可能有点过于耗电。
另请查看this帖子。