Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法使用JobIntentService计划报警_Android_Kotlin_Alarmmanager_Android 8.0 Oreo_Jobintentservice - Fatal编程技术网

Android 无法使用JobIntentService计划报警

Android 无法使用JobIntentService计划报警,android,kotlin,alarmmanager,android-8.0-oreo,jobintentservice,Android,Kotlin,Alarmmanager,Android 8.0 Oreo,Jobintentservice,我一直在研究如何安排针对Oreo+设备的警报。 我目前的做法是使用AlarmManager,一种铃声服务和广播接收器。我得到了报警铃声,并显示通知,但通知和报警没有触发Oreo+设备 我了解到,由于Doze和其他背景限制,使用JobIntentService是一种很好的做法。当前,当使用JobIntentService时,我收到一个错误: java.lang.RuntimeException:执行doInBackground()时出错 我做错了吗?我真的需要实现一个AsyncTask class

我一直在研究如何安排针对Oreo+设备的警报。 我目前的做法是使用
AlarmManager
,一种铃声服务和广播接收器。我得到了报警铃声,并显示通知,但通知和报警没有触发Oreo+设备

我了解到,由于
Doze
和其他背景限制,使用
JobIntentService
是一种很好的做法。当前,当使用
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(以避免使用相同Id的两个不同的intent服务)。如果没有帮助,你可能想深入这个兔子洞: 建议的修复方法之一是在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主屏幕的小部件),则可能会出现问题)。

使用workmanager的应用程序小部件会出现什么样的问题?