我有一个类,它从BroadcastReceiver
延伸并从AlarmManager
调用。在onReceive
方法中,我执行AsyncTask
,它从互联网上获取一些数据并将数据存储在应用程序的本地数据库中。
我是否需要获取唤醒锁:
@Override
public void onReceive(Context context, Intent intent) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
mWakeLock.acquire();
// execute AsyncTask
}
private void asyncTaskDone() {
mWakeLock.release();
}
为了阻止CPU休眠,或者在没有唤醒锁定的情况下执行AsyncTask
是否安全?
答案 0 :(得分:2)
来自BroadcastReceiver文档的OnReceive方法reference说:
..你永远不应该在其中执行长时间运行的操作(有一个 在考虑之前系统允许的超时10秒 接收器被阻挡,候选人被杀死)
因此,您最好用service替换AsyncTask,然后从OnReceive方法调用此服务。即使broadcastReceiver被杀,您的服务也会继续运行。
答案 1 :(得分:1)
我建议你阅读有关receiver lifecycle的文档。你要做的不是好习惯,如果onReceive()方法返回进程就可以被杀死。因此,您的任务无法完成工作。因此,您应该启动Service / IntentService来运行任务并使进程保持活动状态。