繁体   English   中英

使用PARTIAL_WAKE_LOCK保持后台线程活跃

[英]Keep alive a background thread using PARTIAL_WAKE_LOCK

我需要在后台定期运行任务,并保持CPU唤醒。 根据Android 文档,我为此使用PARTIAL_WAKE_LOCK 为了测试唤醒锁,我编写了一个Service,使用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+上, 打ze模式基本上会撤消您的唤醒锁。 一些制造商的6.0之前版本的设备也做类似的事情。

是否可以避免打ze睡模式?

用户可以将您的应用添加到电池优化白名单中。 请注意,要求用户通过ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS进行此ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 可能会导致您的应用被Play商店禁止 ,如果那是您的发行渠道之一。

或者,用户可以始终将其设备放在充电器上。

如果你可以用一个频率较低的轮询周期获得通过,你可以尝试setAndAllowWhileIdle()setExactAndAllowWhileIdle()AlarmManager 充其量,您将每9分钟获得一次控制。 但是,您可能无法访问Internet。

否则,注定要在设备端每隔N分钟轮询一次。

Google希望您在需要时以及通过服务器下推信息来使用GCM / FCM并避免轮询。 我不知道这是否与您的用例有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM