【问题标题】:Implementing awake lock on a service在服务上实现唤醒锁
【发布时间】:2014-01-21 09:04:20
【问题描述】:

我正在从 AlarmManager onReceive 调用服务,下面是实现。我想知道这种唤醒锁的实现是否可以满足我的需求?

这是我的服务类中的 onStart 函数:

@Override
public void onStart(Intent intent, int startId) {
    WakeLock wakeLock = null;
    try{
        PowerManager mgr = (PowerManager)getApplicationContext()
            .getSystemService(Context.POWER_SERVICE);
        wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
        wakeLock.acquire();
        //For time consuming an long tasks you can launch a new thread here
        Toast.makeText(this, " Service Started", Toast.LENGTH_LONG).show();
    }catch(Exception e){
    }finally{
        wakeLock.release();
    }
}

【问题讨论】:

  • 你真的试过了吗?如果是这样,它有效吗?你没有解释任何关于你的服务是如何工作的、它是做什么的或者你的“需要”是什么的。在 API 5 中还弃用了 onStart(...) - 您应该使用 onStartCommand(...)
  • 是的,我已经尝试过了,这就是为什么我在这里发布它以了解我是否遗漏了什么,这在正常情况下有效,但发布的主要原因是了解它在其他情况下的执行情况'正常'的。
  • 就像你指出的弃用 :) 我已经将代码隔离到第二个项目中,以检查功能,现在 thge 服务只显示一条 toast 消息,但在实际程序中它将被实现为做一些我打算在后台线程中进行的大型数据库操作,在这种情况下我也想知道我是否可以使用异步任务并取消 postExecute 中的唤醒锁?
  • 你最终可能需要一个空检查——也不要捕获异常,它被认为是错误的样式——捕获抛出的特定异常

标签: android android-service android-alarms android-wake-lock


【解决方案1】:

是的,这应该可以正常工作。虽然如果你启动一个新线程它不会起作用,但在这种情况下,wakelock.release() 将在线程完成之前被调用。

不过,您可能想查看 CommonsWare 的 Wakeful service。该服务为您处理唤醒锁,确保您在服务期间拥有唤醒锁,并且在您停止服务后立即释放它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
相关资源
最近更新 更多