Android:Moring-早安闹钟开发过程记录(一)

2023-10-11 00:30

本文主要是介绍Android:Moring-早安闹钟开发过程记录(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该文章用于记录整理开发早安闹钟过程的思路及知识点

1.程序介绍

想做这样一个APP源于我经常在睡梦中轻易的把闹钟关掉,导致起不来,各种迟到,并且醒了以后完全不知道闹钟竟然响过,而且经常早上时间来不及了,穿好衣服出了门才发现不是太冷就是太热。

2. 界面布局

为了让HomeActivity的逻辑不会过于复杂,添加了三个Fragment,独立完成各自的逻辑。

  • FragmentAlarm

    用于显示闹钟的相关信息,并处理相关逻辑。核心控件为一个ListView,
    在Item中使用RelativeLayout实现点击出现编辑菜单。

    FragmentAlarm.jpg


    附上菜单动画的代码

    RelativeLayout rl_main = (RelativeLayout) view.findViewById(R.id.rl_main_item);LinearLayout ll_button = (LinearLayout) view.findViewById(R.id.ll_button_item);
    final Button bt_delete = (Button) view.findViewById(R.id.bt_delete_item);final Button bt_update = (Button) view.findViewById(R.id.bt_update_item);
    final SwitchButton sb= (SwitchButton) view.findViewById(R.id.bt_turn_item);
    float back = ll_button.getWidth();
    float front = rl_main.getWidth();float width = back / front;
    ll_button.setMinimumHeight(rl_main.getHeight());
    Log.d("alarm", width + "宽度");TranslateAnimation ta;
    if(isMenuOn){    //开着的就关    ta= new TranslateAnimation(Animation.RELATIVE_TO_SELF, width, Animation.RELATIVE_TO_SELF, 0f,Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);    onMenu=null;    isMenuOn=false;
    }else{    ta= new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, width, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f); onMenu=view;    isMenuOn=true;
    }
    ta.setDuration(200);
    ta.setFillAfter(true);

    View onMenu用来接收当前有菜单开启的item,便于点击下一个Item的时候关闭该菜单,Boolean isMenuOn用于判断当前是否有菜单开启

  • FragmentWeather

     用于显示天气的相关信息,并处理相关逻辑。布局较为简单不进行赘述。

    *FragmentMenu

      用于显示侧滑菜单,侧滑菜单核心控件为ListView

    3.功能分析

  • 闹钟功能模块
    -添加闹钟
        核心逻辑:将用户添加的闹钟的各种信息记录到数据库中,同时在点击完成的时候将数据传给FragmentAlarm,刷新UI。用到的类AlarmInfo.class(闹钟信息对象),AlarmInfoDao(数据库读取工具类)。
    -修改闹钟
        与添加闹钟相同,返回数据时通过不同的RequestCode来与添加闹钟区分
    -启动闹钟定时任务
    AlarmManager
    通过getSystemService(ALARM_SERVICE)获取到AlarmManager对象
    AlarmManger中有set()和setRepeating()方法用于一次性定时任务和重复定时任务
    但在实际测试中发现会有不同程度的delay,(PS.小米真的很严重)
    通过查阅官方文档可知
    在API 19以后这两个方法将不再精准,如果需要使用精确定时任务,应该使用setExact();(API 19以前没有问题)
    -因此在设置定时任务时加一个判断(由于该方法在多处进行调用,我把它单独封装成了一个类)
    public void startAlarm(AlarmManager mAlamManager, PendingIntent pi){   //设置定时任务触发的时间 Calendar c=Calendar.getInstance();                     c.set(Calendar.HOUR_OF_DAY,alarmInfo.getHour());    c.set(Calendar.MINUTE,alarmInfo.getMinute());    c.set(Calendar.SECOND,0);    c.set(Calendar.MILLISECOND, 0);    //  Log.d("alarm", "当前系统版本" + Build.VERSION.SDK_INT);    if(c.getTimeInMillis()<System.currentTimeMillis()){        if(Build.VERSION.SDK_INT>=19) {            mAlamManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis() + 24 * 60 * 60 * 1000, pi);        }else{            mAlamManager.set(AlarmManager.RTC_WAKEUP,     c.getTimeInMillis() + 24 * 60 * 60 * 1000, pi);}    }else{if(Build.VERSION.SDK_INT>=19) {                        mAlamManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);}else{mAlamManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);} }
    }
    -问题来了:setExact();只能执行一次性定时任务如何实现重复闹钟?
    这里我最后采取得方法是在AlarmReceiver中再定一次相同的定时任务,这样在每次收到定时广播后,又重新设定一个相同的定时任务,就能达到重复精确定时的效果。
        另外,在判断闹钟应该在那几天重复,我写的逻辑是,除了一次性闹钟外,所有的重复闹钟都会在每天执行定时广播在AlarmReceiver中去判断今天的dayOfWeek和闹钟信息的dayOfWeek是否吻合吻合就启动闹钟service,否则重新定时
    用于判断当前dayOfweek的代码
    Calendar calendar=Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    int currentDay=calendar.get(Calendar.DAY_OF_WEEK)-1;
    for(int i=0;i<dayOfWeek.length;i++){if(currentDay==dayOfWeek[i]){wakePhoneAndUnlock();//点亮屏幕并解锁ringAlarm();}
    这里用到了点亮屏幕和解锁,也贴一下代码,这段代码是我在CSDN上学到的不知道哪位大大的代码(那天脑袋晕晕的真的忘了T_T,如果原作者看到并且希望我删除或者怎么样的请联系我,我会照做的)
      //点亮屏幕并解锁    private void wakePhoneAndUnlock() {PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);PowerManager.WakeLock mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.FULL_WAKE_LOCK, "WakeLock");mWakelock.acquire();//唤醒屏幕//......KeyguardManager mManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);KeyguardManager.KeyguardLock mKeyguardLock = mManager.newKeyguardLock("Lock");mKeyguardLock.disableKeyguard();mWakelock.release();
    //释放}
    到这里闹钟的基本定时功能就完成了,另外在AlarmReceiver中加入了开机广播的监听,来开启应该要开启的闹钟
    //开机时检查是否有闹钟需要开启
    private void checkAndStartAlarm() {Log.d("alarm","开始检查是否有闹钟");AlarmInfoDao dao=new AlarmInfoDao(context);ArrayList<AlarmInfo> list= (ArrayList<AlarmInfo>) dao.getAllInfo();AlarmClock clock=new AlarmClock(context);for (AlarmInfo alarmInfo:list) {if(PrefUtils.getBoolean(context,alarmInfo.getId(),true)){Log.d("alarm","有闹钟,开启");clock.turnAlarm(alarmInfo,true);}}
    }
    //请自动忽略掉Log信息

    结尾

    到这里闹钟的定时任务就全部完成,在下一篇文章中分析对话框和天气早知道功能的实现
    未完待续...

这篇关于Android:Moring-早安闹钟开发过程记录(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添