Предотвращение перехода службы переднего плана в спящий режим - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть простой сервис переднего плана, который должен регистрироваться в файл каждую секунду и оставлять его работать на ночь. Он отлично работает, пока приложение только запущено, и у меня есть записи в журнале каждую секунду:

Fri Feb 21 2020 at 11:35:12:809 pm  startThread: 4371
Fri Feb 21 2020 at 11:35:13:814 pm  startThread: 4372
Fri Feb 21 2020 at 11:35:14:818 pm  startThread: 4373
Fri Feb 21 2020 at 11:35:15:819 pm  startThread: 4374
Fri Feb 21 2020 at 11:35:16:822 pm  startThread: 4375
Fri Feb 21 2020 at 11:35:17:830 pm  startThread: 4376
Fri Feb 21 2020 at 11:35:18:836 pm  startThread: 4377
Fri Feb 21 2020 at 11:35:19:841 pm  startThread: 4378

Позже телефон не использовался в течение длительного времени, и я полагаю, что он перешел в спящий режим. И теперь у меня есть временные промежутки в лог-файле:

Sat Feb 22 2020 at 02:00:01:581 am startThread: 6232
Sat Feb 22 2020 at 02:00:06:067 am startThread: 6233
Sat Feb 22 2020 at 02:00:07:076 am startThread: 6234
Sat Feb 22 2020 at 02:01:00:741 am startThread: 6235
Sat Feb 22 2020 at 02:01:16:334 am startThread: 6236
Sat Feb 22 2020 at 02:01:17:340 am startThread: 6237
Sat Feb 22 2020 at 02:01:21:338 am startThread: 6238
Sat Feb 22 2020 at 02:09:59:062 am startThread: 6239
Sat Feb 22 2020 at 02:10:00:069 am startThread: 6240
Sat Feb 22 2020 at 02:12:15:060 am startThread: 6241
Sat Feb 22 2020 at 02:12:16:076 am startThread: 6242

Можно ли как-нибудь попросить Android продолжить работу по подсчету, даже если телефон находится в спящем режиме? Можно ли как-нибудь разбудить телефон, если заснуть?

public class ExampleService extends Service {

    class ExampleThread extends Thread {
        int seconds;
        ExampleThread(int seconds) {
            this.seconds = seconds;
        }

        @Override
        public void run() {
            for (int i = 0; i < seconds; i++) {
                Timber.tag(Utils.TIMBER_TAG).v("startThread: " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");

        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, 0);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Example Service")
                .setContentText(input)
                .setSmallIcon(R.drawable.ic_android)
                .setContentIntent(pendingIntent)
                .build();

        startForeground(1, notification);

        //do heavy work on a background thread
        //stopSelf();
        longJob();
        return START_STICKY;
    }


    public void longJob()
    {
        ExampleThread thread = new ExampleThread(60*60*2);
        thread.start();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Timber.tag(Utils.TIMBER_TAG).v("Destroy");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

Позвонить на этот сервер из активности:

    Intent serviceIntent = new Intent(this, ExampleService.class);
    serviceIntent.putExtra("inputExtra", "data");
    ContextCompat.startForegroundService(this, serviceIntent);

1 Ответ

0 голосов
/ 22 февраля 2020

Включите wakelock в onStartCommand вашего сервиса перед вызовом longJob();.

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag");
wakeLock.acquire();

, и когда вы закончите со своей задачей / выполнением, вы можете легко снять wakelock позвонив по номеру: wakelock.release()

* Остерегайтесь того, что WakeLock не даст процессору спать и, следовательно, может вызвать чрезмерное нагревание и разрядку аккумулятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...