Диспетчер работ не работает, когда приложение убито пользователем. Зачем? - PullRequest
1 голос
/ 26 марта 2019

Я хочу выполнить задачу, даже после того, как приложение было убито с помощью диспетчера работ. Но задача не выполняется после того, как приложение убито.

    workManager = WorkManager.getInstance();
    Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
    OneTimeWorkRequest saveData = new OneTimeWorkRequest.Builder(SaveDataWorker.class).setConstraints(constraints).setInitialDelay(10,TimeUnit.SECONDS).build();
    workManager.enqueue(saveData);

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Диспетчер работы полностью зависит от производителя. Некоторые производители или вы также можете сказать, что устройства со стандартным ПЗУ позволяли диспетчеру работы работать так, как это должно быть, но есть некоторые производители устройств («китайские ПЗУ»), которые были очень агрессивны при очисткефоновые приложения, они даже убивают менеджера работы, однако Google пытается заставить менеджер работы нормально работать на всех устройствах, общаясь с OEM.

На данный момент Если вы действительно хотите что-то запустить вВ фоновом режиме вы можете включить опцию автозапуска в xiaomi и некоторых других устройствах, или же вы можете также показать уведомление в трее уведомлений, которое заставляет приложение работать на переднем плане.вы можете проверить, работает ли приложение в фоновом режиме или нет, если нет, вы можете перезапустить его.

if (!isServiceRunning(this, MyService::class.java)) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(Intent(this, MyService::class.java))
        } else {
            startService(Intent(this, MyService::class.java))
        }

    }


 private fun isServiceRunning(context: Context, serviceClass: Class<*>): Boolean {
    val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    val services = activityManager.getRunningServices(Integer.MAX_VALUE)

    if (services != null) {
        for (i in services.indices) {
            if (serviceClass.name == services[i].service.className && services[i].pid != 0) {
                return true
            }
        }
    }
    return false
}


 val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    val pi = PendingIntent.getBroadcast(
        applicationContext,
        34,
        Intent(this, MyBroadcastReceiver::class.java),
        PendingIntent.FLAG_UPDATE_CURRENT
    )
    am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, pi)

И, наконец, в приемнике Broadcast.

 override fun onReceive(context: Context?, intent: Intent?) {
    Handler(Looper.getMainLooper()).post {
        if (!isServiceRunning(context!!, MyService::class.java)) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(Intent(context, MyService::class.java))
            } else {
                context.startService(Intent(context, MyService::class.java))
            }
        }
        val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val pi = PendingIntent.getBroadcast(
            context, 34, Intent(context, MyBroadcastReceiver::class.java),
            PendingIntent.FLAG_UPDATE_CURRENT
        )
        am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pi)
    }
}
0 голосов
/ 27 марта 2019

Как я выяснил, диспетчер работы зависит от производителя устройства. В моем случае это устройство miui, которое не позволяет работать диспетчеру в случае, если приложение убито или перезагружено. Диспетчер работ работал, когда я предоставил приложению «разрешение на автозапуск».

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