当前位置:   article > 正文

2021SC@SDUSC移动互联网项目分析——晃动取消闹钟(三)_intent(context packagecontext, class cls) 2021

intent(context packagecontext, class cls) 2021

2021SC@SDUSC

目录

所需基本知识

IntentService

工作流程

与Service的不同

实现步骤

action

常见的action

MediaPlayer类

create()方法

具体方法

MediaPlayer状态间的转换

使用注意事项

响铃功能

响铃页面时间显示

响铃页面播放背景音乐

ring.java中启动服务


前面的文章主要分析了“晃动取消闹钟”的页面布局和完整的设置/取消闹钟功能,这篇文章主要分析闹钟响铃功能

所需基本知识

IntentService

IntentService是Android中的一个系统封装类,继承自四大组件之一的Service,它是Android提供的后台服务类。

我们在外部组件中通过Intent向IntentService发送请求命令,之后IntentService逐个执行命令队列里的命令,接收到首个命令时,IntentService就开始启动并开始一条后台线程执行首个命令,接着队列里的命令将会被顺序执行,最后执行完队列的所有命令后,服务也随即停止并被销毁。

它的作用是处理异步请求,实现多线程。

工作流程

IntentService工作流程如下:

注意: 若启动IntentService多次,那么每个耗时操作则以队列的方式在IntentService的onHandleIntent回调方法中依次执行,执行完自动结束。

与Service的不同

1.Service依赖于应用程序的主线程,它不是独立的进程或线程,而IntentService会创建一个工作线程来处理多线程任务,IntentService中的程序运行在异步后台线程中。

2.在Service中,后台服务执行完毕之后需要在外部组件中调用stopService方法销毁服务,而IntentService并不需要,它会在工作执行完毕后自动销毁。

实现步骤

1.定义IntentService的子类,传入线程的名称,重写onHandleIntent()方法。
2.AndroidManifest.xml注册Service。
3.在Activity中开启Service。

action

Intent由以下几个部分组成:动作(action)、数据(data)、分类(Category)、类型(Type)、组件(Component)、扩展信息(Extra)。

action描述Intent所触发动作名字的字符串,理论上action可以为任何字符串,而与Android系统应用有关的Action字符串以静态字符串常量的形式定义在Intent类中。action有很多种类,例如呼入、呼出电话,接收短信等。

action可以开发者自己定义。

常见的action

Intent.ACTION_MAIN   String:android.intent.action.MAIN    标识Activity为一个程序的开始;

Intent.Action_CALL   Stirng: android.intent.action.CALL    呼叫指定的电话号码;

Intent.Action.DIAL   String: action.intent.action.DIAL    调用拨号面板;

Intent.ACTION_ANSWER   Stirng:android.intent.action.ANSWER   处理呼入的电话;

Intent.ACTION_ATTACH_DATA   String: android.action.ATTCH_DATA   用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人;

Intent.Action.ALL_APPS   String: andriod.intent.action.ALL_APPS  列出所有的应用

MediaPlayer类

Android多媒体框架支持播放各种常见媒体类型,以便开发者轻松地将音频、视频和图片集成到应用中。开发者可以使用MediaPlayer API播放储存在应用资源内的媒体文件、文件系统中的独立文件或者通过网络连接获得的数据流中的音频或视频。MediaPlayer此类是用于播放声音和视频的主要API。

create()方法

MediaPlayer处于Android多媒体包下"android.media.MediaPlayer",仅有一个无参的构造函数。但为了方便开发者初始化,还未开发者提供了几个静态的create方法完成MediaPlayer初始化工作

常用的两个create()方法:

static MediaPlayer create(Context context,int resid):通过给定的Id来创建一个MediaPlayer实例。

static MediaPlayer create(Context context,Uri uri):通过给定的Uri来创建一个MediaPlayer实例。

具体方法

int getDuration() 得到文件的时间
boolean isLooping () 是否循环播放
boolean isPlaying() 是否正在播放
void pause () 暂停
void start () 开始
void stop () 停止
void prepare() 同步的方式装载流媒体文件。
void prepareAsync() 异步的方式装载流媒体文件。
void setLooping(boolean looping) 设置是否单曲循环
void setNextMediaPlayer(MediaPlayer next) 当 当前这个MediaPlayer播放完毕后,MediaPlayer next开始播放

MediaPlayer状态间的转换

使用注意事项

1.在开始播放之前,MediaPlayer对象必须要进入Prepared状态。最好调用prepareAsync()用异步的方式装载流媒体资源,因为流媒体资源的装载是会消耗系统资源的,在一些硬件不理想的设备上,如果使用prepare()同步的方式装载资源,可能会造成UI界面的卡顿,非常影响用户体验的。

使用异步装载,为了避免还没有装载完成就调用start()而报错的问题,需要绑定MediaPlayer.setOnPreparedListener()事件,它将在异步装载完成之后回调。

2.当播放到流的末尾,播放就完成了。如果调用了setLooping(boolean)方法开启循环模式,那么这个MediaPlayer对象会重新进入Started状态。

3.使用完MediaPlayer需要回收资源。MediaPlayer是很消耗系统资源的,所以在使用完MediaPlayer,不要等待系统自动回收,最好是主动回收资源。

响铃功能

由上篇文章分析得知,AlarmManager的set方法能够设置一次性闹钟,当到达我们设置闹铃的时间时,手机会跳转到“响铃页面”,响铃页面能显示时间并且会有闹铃。

响铃页面时间显示

由上篇博客可知,Calendar类是一个基础抽象类,是Android开发中需要获取时间时必不可少的一个工具类。在Android中,Calendar是能够自动根据手机所设置的时区来调整时间戳的,也就是该时区真实的时间戳。

因此首先通过getInstance()获得Calendar的实例,再调用Calendar的get()方法,传入Calendar.HOUR_OF_DAY和Calendar.MINUTE参数分别获得24小时制的小时和分钟。

再通过if...else...语句对时间进行格式化处理

通过TextView的id属性获取到响铃页面表示时间的TextView

获取到手机响铃时间后调用TextView的setText()方法,呈现响铃时间(经过格式化)

响铃页面播放背景音乐

响铃时需要另外一个线程来播放背景音乐,这就要用到Android中的IntentService类,它是Android提供的后台服务类,它可以处理异步请求,实现多线程。

为了实现IntentService类,需要定义IntentService的子类,重写onHandleIntent()方法,还需要在AndroidManifest.xml注册Service,还要在Activity中开启Service。

此app编写者用工具中的创建服务选项来创建继承IntentService的服务类MyIntentService,AndroidManifest.xml中会自动配置这个服务类。

原来的onHandleIntent()方法 :

首先自定义一个action:ACTION_MUSIC,action描述Intent所触发动作名字的字符串,理论上action可以为任何字符串。这个自定义action表示描述Intent所触发的开启音乐的动作。

重写 onHandleIntent()方法,添加当action为ACTION_MUSIC时系统需执行的操作

 先用if语句判断intent设置的action是否为我们自定义的action ACTION_MUSIC,如果是则调用自定义的handleActionMusic()方法。

handleActionMusic()方法首先判断前文声明的MediaPlayer对象是否为空,若为空则调用create()方法来创建MediaPlayer对象MediaPlayer有两种常用的create()方法,一种是通过给定的Id来创建一个MediaPlayer实例:create(Context context,int resid);另一种是通过给定的Uri来创建一个MediaPlayer实例:create(Context context,Uri uri)。

 很明显此处调用的是create(Context context,int resid),通过给定id来创建MediaPlayer实例。R.raw.gequ是通过id找到存放在res/raw文件夹下的gequ.mp3。

再通过调用setLooping()方法来设置歌曲是否为单曲循环,根据闹铃的特点传入参数"true"设置单曲循环。

再调用start()方法开始歌曲的播放。

ring.java中启动服务

在ring.java中创建一个新的Intent,由前文可知这是个显示Intent。Intent(Context packageContext,Class<?> cls)构造一个指定目标组件的 Intent,这是显式Intent的主要构造方法。设置ring这个Activity为上下文,MyIntentService为Intent开启的新Activity。

将MyIntentService自定义的action ACTION_MUSIC赋值给字符串action,再通过intent调用setAction()方法给Intent指定播放音乐的action。

最后调用startService()开启IntentService。

IntentService实现步骤有三步,前两步在上文使用工具中的创建服务选项来创建继承IntentService的服务类MyIntentService已完成,第三步在Activity中开启Service需要调用startService()方法完成。

这样的话就实现了IntentService,也就实现了到设定闹铃时间跳转到响铃页面并响起闹铃的功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/675811
推荐阅读
相关标签
  

闽ICP备14008679号