第三次Android Studio作业——广播和服务

此次作业继续在先前的 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效果图

说明:
初始状态,点击播放按钮,播放按钮变成暂停按钮,乐曲开始播放;
点击暂停按钮,乐曲暂停,暂停按钮变成播放按钮;
再点击播放按钮继续播放,点击停止按钮,曲目停止,播放进度也会重置;
未播放状态下点击上一曲、下一曲按钮,只会切换曲目;
播放状态下点击上一曲、下一曲按钮,切换曲目的同时会自动播放所切换到的曲目。
在这里插入图片描述

参考博客

1.Android总结篇系列:Android广播机制

作业源码

直接在上一次作业的仓库上更新了
Github:
https://github.com/Tanqsh/AS_firstHomework.git

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值