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

Is it possible to create a JobService to be fired when alarmclock goes off

是否可以创建一个在闹钟响起时触发的 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 中不再起作用。 当警报响起时,有没有办法处理一些任务?例如,当用户早上醒来时我想显示一个 "Good morning message".

Is it possible to create a JobService to be fired when alarmclock goes off?

不,抱歉。

But it is not working any more in Android 8 Oreo.

您正在处理来自约 20 个闹钟应用程序的闹钟广播,这只占正在使用的闹钟应用程序的一小部分。 third-party 闹钟应用不需要在闹钟响起时通知其他应用。

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

我首先创建一个 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"字样。 您需要注意,因为在其他情况下此字段可能为空或包含文本 "Pending alarm"。但是,当它熄灭时,它只是 "Alarm".

  4. 我也把设备的语言改成了主流语言(英文、西班牙文、中文、法文、德文、俄文...),看到可以改成Alarma、Alarme、Wecker , Ébresztő, Ébresztő, Будильник...

有点"analog",但由于Android一直在为我们筑墙,我们试图跳过它们。我不明白为什么 Android 如此限制我们。如果能获得接收警报响起事件的许可,那就太好了。即使是 "dangerous" 权限。