闹钟使用服务(Service)来实现的吗?

时间:2022-07-18 16:44:12
如题,在闹钟设置画面设置闹钟,然后退出闹钟设置画面后,闹钟是作为服务在后台运行的吗?
如果不是,那是以什么方式来运行的?

7 个解决方案

#1


自己up~~~~~

#2


AlarmReceiver extends BroadcastReceiver 
没具体研究过,可以下载alarmclock源码看看。

#3


通过AlarmManager来管理的。

#4


这东西还是得看alarmclock源码!要不然你对系统得非常得解!

#5


系统的闹钟程序准确的说应该是一个系统服务进程了。
LZ可以看看Framework里面的AlarmManagerService.java的源码 ,它注册了一个ClockReceiver,
 @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) {
             scheduleTimeTickEvent();
            } else if (intent.getAction().equals(Intent.ACTION_DATE_CHANGED)) {
               
                TimeZone zone = TimeZone.getTimeZone(SystemProperties.get(TIMEZONE_PROPERTY));
                int gmtOffset = (zone.getRawOffset() + zone.getDSTSavings()) / 60000;

                setKernelTimezone(mDescriptor, -(gmtOffset));
             scheduleDateChangedEvent();
            }
        }
最终提供给应用层是AlarmManager

#6


多谢各位传道授业解惑!
正在学习android呢,一直对service的实际应用比较迷糊~~,现在有个实际应用方面的认识了。

#7


闹钟的确是通过服务实现的, 这个服务的名字叫 AlarmManagerService.

AlarmManagerService 又是通过硬件RTC实现的. 简单地说就是, RTC 硬件对应着 /dev 目录下的一个设备名(比如 alarm), AlarmManagerService 会用 ioctl 函数读 /dev/alarm, 然后就阻塞了, 一旦某个定时器到时了, ioctl 就会从 /dev/alarm 读出一个值并从刚才阻塞的地方继续运行: 找到是谁注册了这个定时器并发出Intent.

#1


自己up~~~~~

#2


AlarmReceiver extends BroadcastReceiver 
没具体研究过,可以下载alarmclock源码看看。

#3


通过AlarmManager来管理的。

#4


这东西还是得看alarmclock源码!要不然你对系统得非常得解!

#5


系统的闹钟程序准确的说应该是一个系统服务进程了。
LZ可以看看Framework里面的AlarmManagerService.java的源码 ,它注册了一个ClockReceiver,
 @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) {
             scheduleTimeTickEvent();
            } else if (intent.getAction().equals(Intent.ACTION_DATE_CHANGED)) {
               
                TimeZone zone = TimeZone.getTimeZone(SystemProperties.get(TIMEZONE_PROPERTY));
                int gmtOffset = (zone.getRawOffset() + zone.getDSTSavings()) / 60000;

                setKernelTimezone(mDescriptor, -(gmtOffset));
             scheduleDateChangedEvent();
            }
        }
最终提供给应用层是AlarmManager

#6


多谢各位传道授业解惑!
正在学习android呢,一直对service的实际应用比较迷糊~~,现在有个实际应用方面的认识了。

#7


闹钟的确是通过服务实现的, 这个服务的名字叫 AlarmManagerService.

AlarmManagerService 又是通过硬件RTC实现的. 简单地说就是, RTC 硬件对应着 /dev 目录下的一个设备名(比如 alarm), AlarmManagerService 会用 ioctl 函数读 /dev/alarm, 然后就阻塞了, 一旦某个定时器到时了, ioctl 就会从 /dev/alarm 读出一个值并从刚才阻塞的地方继续运行: 找到是谁注册了这个定时器并发出Intent.