如果不是,那是以什么方式来运行的?
7 个解决方案
#1
自己up~~~~~
#2
AlarmReceiver extends BroadcastReceiver
没具体研究过,可以下载alarmclock源码看看。
没具体研究过,可以下载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
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的实际应用比较迷糊~~,现在有个实际应用方面的认识了。
正在学习android呢,一直对service的实际应用比较迷糊~~,现在有个实际应用方面的认识了。
#7
闹钟的确是通过服务实现的, 这个服务的名字叫 AlarmManagerService.
AlarmManagerService 又是通过硬件RTC实现的. 简单地说就是, RTC 硬件对应着 /dev 目录下的一个设备名(比如 alarm), AlarmManagerService 会用 ioctl 函数读 /dev/alarm, 然后就阻塞了, 一旦某个定时器到时了, ioctl 就会从 /dev/alarm 读出一个值并从刚才阻塞的地方继续运行: 找到是谁注册了这个定时器并发出Intent.
AlarmManagerService 又是通过硬件RTC实现的. 简单地说就是, RTC 硬件对应着 /dev 目录下的一个设备名(比如 alarm), AlarmManagerService 会用 ioctl 函数读 /dev/alarm, 然后就阻塞了, 一旦某个定时器到时了, ioctl 就会从 /dev/alarm 读出一个值并从刚才阻塞的地方继续运行: 找到是谁注册了这个定时器并发出Intent.
#1
自己up~~~~~
#2
AlarmReceiver extends BroadcastReceiver
没具体研究过,可以下载alarmclock源码看看。
没具体研究过,可以下载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
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的实际应用比较迷糊~~,现在有个实际应用方面的认识了。
正在学习android呢,一直对service的实际应用比较迷糊~~,现在有个实际应用方面的认识了。
#7
闹钟的确是通过服务实现的, 这个服务的名字叫 AlarmManagerService.
AlarmManagerService 又是通过硬件RTC实现的. 简单地说就是, RTC 硬件对应着 /dev 目录下的一个设备名(比如 alarm), AlarmManagerService 会用 ioctl 函数读 /dev/alarm, 然后就阻塞了, 一旦某个定时器到时了, ioctl 就会从 /dev/alarm 读出一个值并从刚才阻塞的地方继续运行: 找到是谁注册了这个定时器并发出Intent.
AlarmManagerService 又是通过硬件RTC实现的. 简单地说就是, RTC 硬件对应着 /dev 目录下的一个设备名(比如 alarm), AlarmManagerService 会用 ioctl 函数读 /dev/alarm, 然后就阻塞了, 一旦某个定时器到时了, ioctl 就会从 /dev/alarm 读出一个值并从刚才阻塞的地方继续运行: 找到是谁注册了这个定时器并发出Intent.