Android 从BroadcastReceiver接收数据后执行数据库操作

Android 从BroadcastReceiver接收数据后执行数据库操作,android,android-asynctask,broadcastreceiver,android-sqlite,Android,Android Asynctask,Broadcastreceiver,Android Sqlite,我使用的是BroadcastReceiver,它以固定的时间间隔获取数据流,然后根据这些数据,我执行某些数据库操作,将这些数据插入到各个表中 问题是,尽管您可以在BroadcastReceiver中执行数据库操作,但接收器可以随时返回。此外,我喜欢在异步任务中执行此类数据库操作 但由于从BroadcastReceiver启动AsyncTask仍然不是一个好的做法,因为如果onReceive()返回并且没有其他活动组件运行,Android可能会终止您的进程,所以我只能使用服务(AFAIK)来完成与

我使用的是
BroadcastReceiver
,它以固定的时间间隔获取数据流,然后根据这些数据,我执行某些数据库操作,将这些数据插入到各个表中

问题是,尽管您可以在
BroadcastReceiver
中执行数据库操作,但接收器可以随时返回。此外,我喜欢在
异步任务中执行此类数据库操作

但由于从
BroadcastReceiver
启动
AsyncTask
仍然不是一个好的做法,因为如果
onReceive()
返回并且没有其他活动组件运行,Android可能会终止您的进程,所以我只能使用
服务
(AFAIK)来完成与数据库相关的工作。此服务应该管理
异步任务
。通过这种方式,Android将了解活动组件,并且不会终止进程

  • 对于给定场景,这是最好的方法吗
就是-

BroadcastReceiver==>服务=>异步任务=>SQLITE(插入)

如果是这样,那么用
IntentService
代替
Service
怎么样

  • 如果我在BroadcastReceiver本身中执行数据库操作呢
我有一个来自
SQLiteOpenHelper
类的单例适配器,因此我可以使用将从
BroadcastReceiver
onReceive()
接收的
上下文来使用适配器进行数据库操作。
但这种方法似乎效率低下


请建议..

为什么不尝试ExecutorService而不是AsyncTask? 看看:

对于给定场景,这是最好的方法吗

我会使用
IntentService
而不是
服务
异步任务
AsyncTask
仅在您有需要在主应用程序线程上完成的工作时使用,并且服务不应该有需要在主应用程序线程上完成的工作

除此之外,让清单注册
BroadcastReceiver
将工作委托给
服务是一种典型的方法

如果我在BroadcastReceiver本身中执行数据库操作呢

如果您的UI恰好位于前台,则在执行
onReceive()
时,它将被冻结

如果你花几秒钟来做这项工作,你会得到相当于一个ANR的背景,你的工作将被打断而无法完成


因此,我建议使用
IntentService

,但正如我所知,
IntentService
本身就是一个
AsyncTask
,所以我可以对IntentService的
onHandleIntent()
执行数据库操作吗?@VedPrakash:“但我知道IntentService本身就是一个异步任务”——不,不是。“那么我可以在IntentService的onHandleIntent()上执行数据库操作吗?”--是的。那么您的意思是将在
onHandleIntent()上执行的数据库操作将不会是
AsyncTask
操作吗?@VedPrakash:
onHandleIntent()
在后台线程上调用。该线程不是使用
AsyncTask
实现的。我正在广播接收器中在各种条件下执行数据库操作。那么,在广播接收机内部多次调用
IntentService
是否会有问题?