【问题标题】:Unable to schedule Alarm using JobIntentService无法使用 JobIntentService 安排警报
【发布时间】:2018-10-29 15:46:00
【问题描述】:

我一直在研究如何安排针对 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
    }
}

【问题讨论】:

    标签: android kotlin alarmmanager android-8.0-oreo jobintentservice


    【解决方案1】:

    您可以尝试将您的支持库更新到最新和最好的并设置一些 > 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/

    【讨论】:

    • 使用 workmanager 的应用小部件会出现什么样的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多