Невозможно запланировать тревогу с помощью JobIntentService - PullRequest
0 голосов
/ 29 октября 2018

Я изучал, как планировать устройства наведения тревоги Oreo +. Мой текущий подход использует AlarmManager, услугу Ringtone и широковещательный приемник. Я получил сигнал тревоги, чтобы позвонить и отобразить уведомление, но уведомление и сигнал тревоги не срабатывают для устройств Oreo +.

Я узнал, что использование JobIntentService является хорошей практикой из-за Doze и других фоновых ограничений. В настоящее время при использовании JobIntentService я получаю сообщение об ошибке:

java.lang.RuntimeException: произошла ошибка при выполнении doInBackground ()

Я делаю это неправильно? Мне действительно нужно реализовать AsyncTask?

class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val alarmStatus: String = intent!!.getStringExtra("alarmStatus")
        val serviceIntent = Intent(context, RingtoneService::class.java)
        serviceIntent.putExtra("alarmStatus", alarmStatus)
        //context!!.startService(serviceIntent)
        RingtoneService.enqueueWork(context, serviceIntent)
    }
}

class RingtoneService : JobIntentService() {
    // Enqueing work to do in this service.
    companion object {
        val SERVICE_JOB_ID = 1

        fun enqueueWork(context: Context?, work: Intent) {
            if (context != null) {
                enqueueWork(context, RingtoneService::class.java, RingtoneService.SERVICE_JOB_ID, work)
            }
        }
    }

    override fun onHandleWork(intent: Intent) {
        onHandleIntent(intent)
    }

    private fun onHandleIntent(intent: Intent) {
        //handling of notification goes here
    }
}

1 Ответ

0 голосов
/ 29 октября 2018

вы можете попытаться обновить ваши библиотеки поддержки до последней и самой лучшей версии и указать некоторое число> 1 (чтобы избежать использования двух разных сервисов с одним и тем же Id). Если это не поможет, возможно, вы захотите пойти глубже в эту кроличью нору: https://issuetracker.google.com/issues/63622293 Одним из предлагаемых исправлений является использование класса-оболочки вокруг JobIntentService:

package android.support.v4.app;

import android.content.Intent;

public abstract class FixedJobIntentService extends JobIntentService {

    @Override
    GenericWorkItem dequeueWork() {
        try {
            return new FixedGenericWorkItem(super.dequeueWork());
        } catch (SecurityException ignored) {
        }
        return null;
    }

    private class FixedGenericWorkItem implements GenericWorkItem {
        final GenericWorkItem mGenericWorkItem;

        FixedGenericWorkItem(GenericWorkItem genericWorkItem) {
            mGenericWorkItem = genericWorkItem;
        }

        @Override
        public Intent getIntent() {
            if (mGenericWorkItem != null) {
                return mGenericWorkItem.getIntent();
            }
            return null;
        }

        @Override
        public void complete() {
            try {
                if (mGenericWorkItem != null) {
                    mGenericWorkItem.complete();
                }
            } catch (IllegalArgumentException ignored) {
            }
        }
    }
}

Или вы можете попробовать использовать новый блестящий WorkManager из компонентов архитектуры (могут возникнуть проблемы, если у вас есть виджет приложения (тот, что для домашнего экрана Android) в вашем приложении). https://developer.android.com/topic/libraries/architecture/workmanager/

...