首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerManager.PARTIAL_WAKE_LOCK安卓

PowerManager.PARTIAL_WAKE_LOCK安卓
EN

Stack Overflow用户
提问于 2013-12-02 05:27:09
回答 2查看 5.1K关注 0票数 2

我很困惑是否要获得这个警钟。例如,我有这种类型的代码,它来自asynchronouslyonReceive() of a BroadcastReceiever (CONNECTIVITY_CHANGE,BOOT_COMPLETED等),也就是说,我正在从onReceive()启动一个执行繁重任务的IntentService

代码语言:javascript
复制
private static void insertInDatabase(Context context /*, some data to be inserted in database*/) {
        Database helper = Database.getInstance(context);
        PowerManager pm = (PowerManager) context
            .getSystemService(Context.POWER_SERVICE);
        final WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName); 
        wakeLock.acquire();
        try { 
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            // insert data in database here  
        } finally {
            wakeLock.release();
        }
    }

这个场景是获得PowerManager.PARTIAL_WAKE_LOCK的合适人选吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-02 16:05:35

@paha的回答忽略了一个要点: IntentService是不够的。在onReceive()结束和IntentService启动之间,手机可能会再次入睡。您需要一个(静态)锁来弥补这一差距--这是在Mark的WakefulIntentService中实现的

所以保留AlarmManager和接收器,但是从onReceive()启动一个WakefulIntentService

请参见:

票数 3
EN

Stack Overflow用户

发布于 2013-12-02 06:07:22

方法onReceive()在主应用程序线程上运行,您不知道insertInDatabase()需要多长时间。使用IntentService执行数据库插入和调度警报。IntentService将在后台线程上调用您的onHandleIntent(),因此您可以占用所需的时间,并且在onHandleIntent()完成时服务会自动消失。

代码语言:javascript
复制
public class MyIntentService extends IntentService {

    @Override
    protected void onHandleIntent(Intent intent) {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        final WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName); 
        wakeLock.acquire();
        wl.acquire();
        try { 
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            // insert data in database here  
        } finally {
            wakeLock.release();
        }
    }
}

要从IntentService启动BroadcastReceiver,请使用AlarmManagerIntentService作为队列模式工作,您不需要担心操作的同步性。

经讨论后在评论中添加:

您的代码示例没有说明您从何处调用PARTIAL_WAKE_LOCK。简单地说,PARTIAL_WAKE_LOCKBroadcastReciever中是不需要的,PARTIAL_WAKE_LOCKIntentService中是必需的。也许这会对BroadcastReceiver, Service and Wakelock有帮助

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20321444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档