Android,关闭显示器时保持CPU开启?

时间:2016-10-27 16:28:26

标签: android timer wakelock

我的智慧结束了这个问题。无法找到一个好的解决方案!在我的应用程序中,我有一个服务,在其中计时器被反复安排。这意味着在执行每个timerTask之后,启动另一个timerTask(首先,取消定时器和timerTask,然后分配一个新的Timer和TimerTask)。这是一天24小时完成的!我需要这个:首先启动应用程序,启动服务,然后关闭显示器并让设备独立。但麻烦是每次我回到设备,我发现我的应用程序已完成一些任务然后卡在计时器,虽然它的时间间隔通过!我认为这是因为CPU睡眠。

有关更多说明,假设我有一个以秒为单位的时间间隔列表:{60,100,40,120,80}。我开始服务并将设备单独放置5分钟。然后我回来看看60和100秒的任务完成了。但是这项服务停留在40岁的任务!

每个任务都包含一个非常简单的网络作业,最多需要5秒。 我尝试了一个唤醒锁,但它没有帮助。我不知道为什么!

以下是我的服务代码:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    startForeground(id, new Notification());
    pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,"");
    wl.acquire();
    doAction();
    return START_STICKY;
}

private void doAction(){
    if (timer != null)
        timer.cancel;
    if (timerTask != null)
        timerTask.cancel;
    timer = new Timer();
    timerTask = new TimerTask() {
            @Override
            public void run() {
                doAction();
                //Do some network job!
            }
    };
    timer.schedule(timerTask, getNewInterval());
}

1 个答案:

答案 0 :(得分:1)

您不应该保留唤醒锁,因此可能会有一些电源管理系统功能会导致您的服务失效。阅读文档:

WakefulBroadcastReceiver

AlarmManager

并查看第一个选项或第二个选项是否与IntentService相结合无法满足您的要求。您可以在AlarmManager被其他时刻(甚至是setExact()

精确地重置警报时重置警报