使用partial_wake_lock保持背景线程



我需要定期在后台运行任务,并保持清醒的CPU。根据Android文档,我为此目的使用了 partial_wake_lock 。为了测试唤醒锁,我写了一项服务,该服务使用 scheduledthreadpoolexecutor 启动每2分钟的线程。此线程只需在sdcard中的日志文件上写一个字符串。

然后,我执行了以下简单测试:运行应用程序并从电源中拔下设备。经过2或3个小时的正确执行后,服务停止运行线程,并且在日志文件中没有写新字符串。

服务的代码:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "Service onStartCommand");
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WiOpp wakeLock");
    wakeLock.acquire();
    TestTask testTask = new TestTask(getApplicationContext());
    ScheduledThreadPoolExecutor monitorPool = new ScheduledThreadPoolExecutor(1);
    monitorPool.scheduleAtFixedRate(testTask, 0, 120, TimeUnit.SECONDS);
    return START_STICKY;
}

testtask的代码:

@Override
public void run() {
    //write on log file
    LogManager.getInstance().logData("I am running!");
}

我希望在关闭显示时也执行线程,但是查看我的日志文件似乎并非如此。我在哪里错了?

在Android 6.0 上,打击模式基本上会撤消您的Wakelock。来自一些制造商的6.0 pre-6.0设备也可以做类似的事情。

有可能避免打ze式模式吗?

用户可以将您的应用程序添加到电池优化白名单中。请注意,如果这是您的分销渠道之一,请用户通过ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS进行此操作可能会导致您的应用程序被禁止使用。

或,用户可以一直将其设备保存在充电器上。

如果您可以在不频繁的轮询期间获得,则可以使用setAndAllowWhileIdle()AlarmManager尝试setExactAndAllowWhileIdle()。充其量,您将每9分钟得到一次控制。不过,您可能没有互联网访问。

否则,设备侧民意测验每分钟的方法注定要失败。

Google希望您使用GCM/FCM,并避免使用服务器,以便在需要时按下信息。我不知道这是否与您的用例有关。

最新更新