<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Android%E4%B8%AD%E7%9A%84%E9%97%B9%E9%92%9F%E4%B8%8ERTC</id>
	<title>Android中的闹钟与RTC - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Android%E4%B8%AD%E7%9A%84%E9%97%B9%E9%92%9F%E4%B8%8ERTC"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Android%E4%B8%AD%E7%9A%84%E9%97%B9%E9%92%9F%E4%B8%8ERTC&amp;action=history"/>
	<updated>2026-09-01T05:28:25Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=Android%E4%B8%AD%E7%9A%84%E9%97%B9%E9%92%9F%E4%B8%8ERTC&amp;diff=837&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 12:02 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Android%E4%B8%AD%E7%9A%84%E9%97%B9%E9%92%9F%E4%B8%8ERTC&amp;diff=837&amp;oldid=prev"/>
		<updated>2015-05-06T12:02:16Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;这里以MSM8916为例，大概介绍一下 Android中 RTC的实现模式。&lt;br /&gt;
&lt;br /&gt;
我们知道，RTC的主要功能就是保证系统睡眠、甚至掉电的情况下，时钟的准确性，同时提供定时唤醒系统、甚至定时开机的功能。&lt;br /&gt;
&lt;br /&gt;
先来看一下 android中的闹钟。&lt;br /&gt;
&lt;br /&gt;
android的闹钟分为以下三种类型：RTC , RTC_WAKEUP 和 RTC_POWEROFF_WAKEUP，其他的实质都是这三者中的一种：&lt;br /&gt;
&lt;br /&gt;
*RTC&lt;br /&gt;
:只在机器唤醒时计时，进入睡眠后就暂停&lt;br /&gt;
&lt;br /&gt;
*RTC_WAKEUP &lt;br /&gt;
:具备唤醒机器特性，即闹钟时间到后，即使机器处于睡眠状态，也会把机器唤醒以执行任务&lt;br /&gt;
&lt;br /&gt;
*RTC_POWEROFF_WAKEUP&lt;br /&gt;
:除了具备 RTC_WAKEUP的特性外，还具备自动开机功能，即闹钟时间超时后，如果机器处于关机状态，就会把机器自动开机来执行任务&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
App设置一个闹钟时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+120000, chkPenIntent);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
将调用 AlarmManagerService.set ==&amp;gt; AlarmManagerService.setImplLocked ==&amp;gt; AlarmManagerService.rescheduleKernelAlarmsLocked ==&amp;gt; AlarmManagerService.setLocked&lt;br /&gt;
&lt;br /&gt;
*从 rescheduleKernelAlarmsLocked可以发现 AlarmManagerService并不是直接将 App设置的alarm传下去，而是在这里进行了预处理，只把最先触发的 alarm分类传到了 jni中&lt;br /&gt;
&lt;br /&gt;
进入jni:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
static void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jint fd, jint type, jlong seconds, jlong nanoseconds)&lt;br /&gt;
{&lt;br /&gt;
    struct timespec ts;&lt;br /&gt;
    ts.tv_sec = seconds;&lt;br /&gt;
    ts.tv_nsec = nanoseconds;&lt;br /&gt;
&lt;br /&gt;
	int result = ioctl(fd, ANDROID_ALARM_SET(type), &amp;amp;ts);&lt;br /&gt;
	if (result &amp;lt; 0)&lt;br /&gt;
	{&lt;br /&gt;
        ALOGE(&amp;quot;Unable to set alarm to %lld.%09lld: %s\n&amp;quot;, seconds, nanoseconds, strerror(errno));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
fd在 jni init中被初始化：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
static jint android_server_AlarmManagerService_init(JNIEnv* env, jobject obj)&lt;br /&gt;
{&lt;br /&gt;
    return open(&amp;quot;/dev/alarm&amp;quot;, O_RDWR);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接下来，看一下 /dev/alarm这个驱动&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>