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

2023-10-11 00:30

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

续接上一篇文章

1.叫醒功能实现

  • 叫醒对话框
    这个对话框是不是很丑啊?这个对话框之所以丑的原因是因为我懒~


    闹钟对话框.png


    分析一下这个对话框的特点,就是三点

    • a.要根据用户选择的赖床指数显示不同难度的题目
    • b.要将用户输入的结果跟正确答案进行对比
    • c.不允许退出(这样才能达到暴力叫醒),返回键也无效
      a
      在dialog上的代码就是setMessage(),在AlarmReceiverzhong 根据LazyLevel生成两个随机数
      private int youCantSleep() {
      Random a=new Random();
      if(lazylevel==1){A = a.nextInt(20)+5;B = a.nextInt(20)+5;
      }else if(lazylevel==2){A = a.nextInt(99)+1;B = a.nextInt(99)+1;while(B<50) B+=10;
      }else if(lazylevel==3){A = a.nextInt(200)+1;B = a.nextInt(200)+1;while (B<80)    B+=10;while(A<80)    A+=10;
      }else if(lazylevel==4){A = a.nextInt(500)+1;B = a.nextInt(500)+1;while(B<80)    B+=10;while(A<200)    A+=30;
      } 
      return A*B;
      }
      b
      这个比较简单,positiveButton的监听中if判断一下正确答案和输入答案,正确的话就dialog.dismiss();
      c
      -首先Alertdialog.Builder有一个方法setCancelable(false);传入false将不可以点击取消,点击Home键都不可以被取消,只能通过确定。当然杀进程是可以的~
      builder.setCancelable(false);
      -然后将dialog设置成为系统级别
      AlertDialog dialog=builder.create();
      WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
      params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
      这里需要一个权限
      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  • 播放闹钟铃声
    启动一个Service来播放音乐,播放的音乐由AlarmReceiver通过Intent传递过去

    • 启动AlarmService
      Intent service=new Intent(context, AlarmRingService.class);
      service.putExtra("resid", resid);
      context.startService(service);
    • AlarmService在onStartCommand中获取到数据
      //拿到用户选择的那个铃声
      Song=intent.getStringExtra("resid");if (Song==null){
      //    为了程序的健壮性,判断一下,以免出现不必要的异常Song="everybody.mp3";}
      ringTheAlarm(Song);
    • 播放音乐(MediaManager)
      核心代码
      mPlayer=new MediaPlayer();
      assetFileDescriptor = this.getAssets().openFd(song);
      mPlayer.reset();
      mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
      mPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
      重点
      mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
      注意 该方法必须在prepare()之前调用,否则无效!
      该方法将这个MediaPlayer设置成为某一个特定的媒体类型,这里设置成为STREAM_ALARM,这样可以实现调节闹钟音量不会影响其他音量,避免用户设置为手机静音后闹钟失效。
  • 开启震动

    private void startVibrate() {mVibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);if(mVibrator.hasVibrator()){mVibrator.vibrate(new long[]{500, 1500, 500, 1500}, 0);//off on off on  repeatmode}
    }
  • 停止服务
    当用户关闭闹钟时停止服务,因此关闭音乐和关闭震动的代码写在onDestroy中
    @Overridepublic
    void onDestroy() {super.onDestroy();stopTheAlarm();stopVibrate();
    }

    结尾

    简单记录了下开发的思路,以及一些小的,但是容易漏掉的知识点,调试的时候会很让人抓狂的。下一篇文章分析FragmentWeather中实现的逻辑
未完待续...

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


原文地址:https://blog.csdn.net/qiaoxiaoxi621/article/details/50540682
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/184221

相关文章

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示