是否可以创建一个在alarmclock熄灭时触发的JobService

时间:2018-04-02 23:22:49

标签: android android-8.0-oreo jobservice

是否可以创建一个在闹钟响起时触发的JobService?

我以前在广播接收器的清单中有这个代码:

                <action android:name="com.android.deskclock.ALARM_ALERT" />                    
                <action android:name="com.samsung.sec.android.clockpackage.alarm.ALARM_ALERT" />
                <!-- <action android:name="com.samsung.sec.android.clockpackage.alarm.ALARM_DONE" /> -->
                <action android:name="com.htc.android.worldclock.ALARM_ALERT" />
                <action android:name="com.htc.android.ALARM_ALERT" />
                <action android:name="com.sonyericsson.alarm.ALARM_ALERT" />
                <action android:name="com.sonyericsson.organizer.Organizer_WorldClock" />
                <action android:name="com.sonyericsson.organizer.Organizer" />
                <action android:name="com.lge.clock.AlarmClockActivity" />
                <action android:name="com.lge.clock.DefaultAlarmClockActivity" />
                <action android:name="com.lge.alarm.alarmclocknew" />
                <action android:name="zte.com.cn.alarmclock.ALARM_ALERT" />
                <action android:name="com.motorola.blur.alarmclock.ALARM_ALERT" />
                <!-- Third party Alarms -->
                <action android:name="com.mobitobi.android.gentlealarm.ALARM_INFO" /> <!-- Gentle Alarm -->
                <action android:name="com.urbandroid.sleep.alarmclock.ALARM_ALERT" /> <!-- Sleep As Android -->
                <action android:name="com.splunchy.android.alarmclock.ALARM_ALERT" /> <!-- Alarmdroid (1.13.2) -->
                <action android:name="net.havchr.mr2.services.AlarmNoiser" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.broadcastreceivers.AlarmBroadcastReceiver" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.services.FlicButtonTurnOffAlarmService" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.broadcastreceivers.ALARM_ALERT" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.services.ALARM_ALERT" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.ALARM_ALERT" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.ALARM_ALERT_SERVICE" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.ALARM_NOTIFICATION_SERVICE" /> <!-- Morning Routine -->
                <action android:name="net.havchr.mr2.FLIC_LISTENER_SERVICE" /> <!-- Morning Routine -->
                <action android:name="REFRESH_THEM_VIEWS" /> <!-- Morning Routine -->
                <action android:name="com.vp.alarmClockPlusDock" /> <!-- Alarm Clock Plus -->

但它在Android 8 Oreo中不再有效。 警报响起时有没有办法处理某些任务?例如,当用户在早上醒来时,我想显示“早安消息”。

2 个答案:

答案 0 :(得分:0)

  

是否可以创建一个在闹钟响起时触发的JobService?

不,抱歉。

  

但它在Android 8 Oreo中不再有效。

您正在处理来自~20个闹钟应用程序的警报广播,这是使用中的闹钟应用程序的一小部分。当闹钟响起时,不需要第三方闹钟应用程序告诉其他应用程序。

答案 1 :(得分:0)

要解决这个问题,我需要创建一个复杂的解决方法。但它的确有效。让我解释一下我做了什么。

我首先创建一个NotificationListenerService来读取设备中显示的每个通知。 当然,您需要通过以下方式申请许可:

startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));

然后,在onNotificationPosted()函数中,我这样做:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    if (sbn.getPackageName().equalsIgnoreCase("com.google.android.deskclock")) {
        //The Android standard clock app is displaying a notification. We still need to check that the notification is because the alarm is going off right now, and not because the user has set an alarm at a specific time and the system displays de clock icon: 
        oNotification = sbn.getNotification();
        String s1 = "" + oNotification.extras.getCharSequence(Notification.EXTRA_TITLE);
        if(s1.equalsIgnoreCase("Alarm") || s1.equalsIgnoreCase("Alarma") || s1.equalsIgnoreCase("Alarme") || s1.equalsIgnoreCase("Sveglia") || s1.equalsIgnoreCase("Будильник") || s1.equalsIgnoreCase("Alarmă") || s1.equalsIgnoreCase("المنبه") || s1.equalsIgnoreCase("Wecker") || s1.equalsIgnoreCase("Ébresztő") || s1.equalsIgnoreCase("Wekker") || s1.equalsIgnoreCase("Будильник") || s1.equalsIgnoreCase("闹钟") || s1.equalsIgnoreCase("鬧鐘") ) {  //En varios idiomas
            //Alarm is going off right now!!!!
        }
    }
}
  1. 我检查发布的通知是否属于标准的Android闹钟应用程序(com.google.android.deskclock)。

  2. 然后,我需要区分一个常规通知,显示警报是在特定时间设置的,而不是通知实际警报。

  3. 在看了几个例子之后,我发现当闹钟响起时,它在Notification.EXTRA_TITLE字段中有“Alarm”字样。 您需要注意,因为在其他情况下,此字段可能为null或具有文件“待处理警报”。但是,当它关闭时,它只是“警报”。

  4. 我还将设备的语言更改为主要语言(英语,西班牙语,中文,法语,德语,俄语...),并且可以将其更改为Alarma,Alarme,Wecker,Ébresztő,المنبه ,Будильник...

  5. 它有点“模拟”,但由于Android为我们建立了墙,我们试图跳过它们。我无法理解为什么Android限制了我们这么多。获得接收事件警报的许可将是美好的。即使这是一个“危险”的许可。