ADROID 2.1 架构解析 6 闹钟

2024-01-02 18:58
文章标签 解析 架构 2.1 闹钟 adroid

本文主要是介绍ADROID 2.1 架构解析 6 闹钟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

6 闹钟

6.1 设置定时时间

文件:packages/apps/alarmclock/src/com/android/alarmclock/Alarms.java

private static void enableAlert(Context context, final Alarm alarm,

            final long atTimeInMillis) {

        AlarmManager am = (AlarmManager)

context.getSystemService(Context.ALARM_SERVICE);

              ...

        am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);

              ...

    }

由闹钟管理器设置定时时间。

6.2 闹钟管理器

6.2.1 定时设置

文件:frameworks/base/core/java/android/app/AlarmManager.java

public static final int RTC_WAKEUP = 0;

    public static final int RTC = 1;

    public static final int ELAPSED_REALTIME_WAKEUP = 2;

public static final int ELAPSED_REALTIME = 3;

    AlarmManager(IAlarmManager service) {

        mService = service;

    }

    public void set(int type, long triggerAtTime, PendingIntent operation) {

        try {

            mService.set(type, triggerAtTime, operation);

        } catch (RemoteException ex) {

        }

    }

将type, triggerAtTime, operation等参数转向闹钟管理器服务。

6.3 闹钟管理器服务

文件:frameworks/base/services/java/com/android/server/AlarmManagerService.java

6.3.1 定时设置

public AlarmManagerService(Context context) {

         mDescriptor = init();

             ...

}

public void set(int type, long triggerAtTime, PendingIntent operation) {

        setRepeating(type, triggerAtTime, 0, operation);

    }

   

    public void setRepeating(int type, long triggerAtTime, long interval,

            PendingIntent operation) {

        if (operation == null) {

            Log.w(TAG, "set/setRepeating ignored because there is no intent");

            return;

        }

        synchronized (mLock) {

            Alarm alarm = new Alarm();

            alarm.type = type;

            alarm.when = triggerAtTime;

            alarm.repeatInterval = interval;

            alarm.operation = operation;

            // Remove this alarm if already scheduled.

            removeLocked(operation);

            if (localLOGV) Log.v(TAG, "set: " + alarm);

            int index = addAlarmLocked(alarm);

            if (index == 0) {

                setLocked(alarm);

            }

        }

    }

private void setLocked(Alarm alarm)

    {

        if (mDescriptor != -1)

        {

            set(mDescriptor, alarm.type, (alarm.when * 1000 * 1000));

        }

        else

        {

            Message msg = Message.obtain();

            msg.what = ALARM_EVENT;

           

            mHandler.removeMessages(ALARM_EVENT);

            mHandler.sendMessageAtTime(msg, alarm.when);

        }

    }

Init,set 为底层操作函数,set(mDescriptor, alarm.type, (alarm.when * 1000 * 1000)); 由底层来完成定时设置。

6.3.2等待计时结束

private class AlarmThread extends Thread

    {

        public void run()

        {

                     ...

            while (true)

            {

                int result = waitForAlarm(mDescriptor);

               

                            ...

                    if ((result & RTC_WAKEUP_MASK) != 0)

                        triggerAlarmsLocked(mRtcWakeupAlarms, triggerList, nowRTC);

                   

                    if ((result & RTC_MASK) != 0)

                        triggerAlarmsLocked(mRtcAlarms, triggerList, nowRTC);

                   

                    if ((result & ELAPSED_REALTIME_WAKEUP_MASK) != 0)

                        triggerAlarmsLocked(mElapsedRealtimeWakeupAlarms, triggerList, nowELAPSED);

                   

                    if ((result & ELAPSED_REALTIME_MASK) != 0)

                        triggerAlarmsLocked(mElapsedRealtimeAlarms, triggerList, nowELAPSED);

                        ...

              }

        }

}

在服务里采用线程来处理计时结束返回的信息,根据等待计时结束返回的信息触发不同的操作。

6.4 硬件调用

文件:frameworks/base/services/jni/com_android_server_AlarmManagerService.cpp

6.4.1 定时设置

static jint android_server_AlarmManagerService_init(JNIEnv* env, jobject obj)

{

#if HAVE_ANDROID_OS

    return open("/dev/alarm", O_RDWR);

#else

       return -1;

#endif

}

static void android_server_AlarmManagerService_close(JNIEnv* env, jobject obj, jint fd)

{

#if HAVE_ANDROID_OS

       close(fd);

#endif

}

static void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jint fd, jint type, jlong nanoseconds)

{

#if HAVE_ANDROID_OS

    struct timespec ts;

    ts.tv_sec = NANOSECONDS_TO_SECONDS(nanoseconds);

    ts.tv_nsec = nanoseconds - SECONDS_TO_NANOSECONDS(ts.tv_sec);

   

       int result = ioctl(fd, ANDROID_ALARM_SET(type), &ts);

       if (result < 0)

       {

        LOGE("Unable to set alarm to %lld: %s/n", nanoseconds, strerror(errno));

    }

#endif

}

以上函数的绑定如下:

       {"init", "()I", (void*)android_server_AlarmManagerService_init},

       {"close", "(I)V", (void*)android_server_AlarmManagerService_close},

       {"set", "(IIJ)V", (void*)android_server_AlarmManagerService_set},

由上可知,通过ioctl接口,设置定时时间。

6.4.2 等待计时结束

static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv* env, jobject obj, jint fd)

{

#if HAVE_ANDROID_OS

       int result = 0;

      

       do

       {

              result = ioctl(fd, ANDROID_ALARM_WAIT);

       } while (result < 0 && errno == EINTR);

      

       if (result < 0)

       {

        LOGE("Unable to wait on alarm: %s/n", strerror(errno));

        return 0;

    }

   

    return result;

#endif

}

以上函数的绑定如下:

{"waitForAlarm", "(I)I", (void*)android_server_AlarmManagerService_waitForAlarm},

由上可知,代码阻塞方式等待计时结束或由意外中断结束。

这篇关于ADROID 2.1 架构解析 6 闹钟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/563357

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro