此次作业继续在先前的 Game Store 界面布局中实现,但是老师给的task是一个简单音乐播放器,与游戏商场风格有点小冲突。但是勉勉强强,在我所构想的讨论界面,用户可以一边看讨论话题,一边激烈评论,一边听歌自嗨,也很美哉。
上面就是效果图,虽然UI设计有些丑,但这不是本质,接下来我们讨论一下 Android Studio 的广播和服务。
广播和服务
广播
Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。具体实现流程要点粗略概括如下:
1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;
2.广播发送者通过binder机制向AMS发送广播;
3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同,但总体流程大致如上。
服务
默默运行在后台的组件,可以理解为是没有前台的activity,适合用来运行不需要前台界面的代码。系统发送广播通知服务启动。
实现思路和流程
1.在配置文件中注册服务
在 manifests\AndroidManifest.xml 文件中注册music服务。即添加下面代码中的 service标签。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MusicService"></service>
</application>
</manifest>
2.编写界面布局文件。
由于要将音乐播放器添加在讨论界面,于是对 tab03.xml 进行修改。
3.修改 DiscussionFragment.java
在原有的 DiscussionFragment.java 文件中,我们获取到 tab03.xml 页面及页面中的几个按钮,再为按钮设置监听。不同的按钮被点击,会设置不同的intent内容(这里的Intent主要是传递按钮的点击信息),然后再将intent广播到MusicService,通知服务做出变更(播放、暂停、停止、上一曲、下一曲)。
再自定义BroadcastReceiver,并为其重写onReceive方法,在这个方法中,我们会接收到从MusicService发送来的广播,根据广播中信息同步更新界面布局按钮图片、当前播放的歌曲信息、控制系统的状态。
4.新增 MusicService.java
音乐服务类(MusicService)继承 Service 。在 MusicService 中,要实现轮播(一首音乐播放完后自动播放下一首)、一个音乐播放函数prepareAndPlay、一个BroadcastReceiver重写onReceive方法以接收从DiscussionFragment发来的广播(按钮点击信息)。其中onReceive较为复杂,要实现对播放器当前状态的判断和更新以及对当前曲目的控制,还要将更新后的状态和曲目放进一个Intent,发送到DiscussionFragment以实现界面信息同步更新。
最终gif效果图
说明:
初始状态,点击播放按钮,播放按钮变成暂停按钮,乐曲开始播放;
点击暂停按钮,乐曲暂停,暂停按钮变成播放按钮;
再点击播放按钮继续播放,点击停止按钮,曲目停止,播放进度也会重置;
未播放状态下点击上一曲、下一曲按钮,只会切换曲目;
播放状态下点击上一曲、下一曲按钮,切换曲目的同时会自动播放所切换到的曲目。
参考博客
作业源码
直接在上一次作业的仓库上更新了
Github:
https://github.com/Tanqsh/AS_firstHomework.git