文章目录

  • 一、知识要点
  • 二、xml代码
    • activity_main.xml
  • 三、java代码
    • MainActivity.java
    • MusicService.java
  • 四、运行界面展示
  • 五、 源码GitHub的地址:

一、知识要点

使用Android Studio编写一个简单的音乐盒,需要用到BroadcastReceiver组件,它是Android的四大组件之一,用来编写广播接收者程序,对广播做出响应。要求音乐盒能够实现上一首、播放/暂停、停止、下一首的功能,同时显示播放歌曲的简单信息。
Broadcast(广播机制) 是一种广泛运用的应用程序之间传输信息的机制,而 BroadcastReceiver(广播接收器) 则是用于接收来自系统和应用的广播对并对其进行响应的组件,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。创建一个广播接收器非常简单,只需要继承 BroadcastReceiver,并重写onReceive()即可。BroadcastReceiver也是四大组件之一,所以我们也需要对BroadcastReceiver进行注册,不同于其他四大组件,BroadcastReceiver有两种注册方式,分别是静态注册和动态注册。
而之所以要用广播机制来制作手机音乐盒;是因为现在的都是在线音乐盒,在我们点击播放一首歌曲的时候,要从服务器拿数据,然后播放,这其实不止一个流程,可以理解为多线程的,普通的函数调用实现效果不好。而广播机制和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。

二、xml代码

activity_main.xml

<?xml version="1.0" encoding="UTF-8"?><LinearLayoutandroid:layout_height="wrap_content"android:layout_width="match_parent"android:orientation="horizontal"xmlns:android="http://schemas.android.com/apk/res/android"><ImageButtonandroid:layout_margin="10dp"android:layout_height="wrap_content"android:layout_width="wrap_content"android:src="@drawable/play"android:id="@+id/play"/><ImageButtonandroid:layout_margin="10dp"android:layout_height="wrap_content"android:layout_width="wrap_content"android:src="@drawable/stop"android:id="@+id/stop"/><TextViewandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:id="@+id/title"android:marqueeRepeatLimit="marquee_forever"android:layout_weight="1"android:ellipsize="marquee"android:textColor="#9C27B0"android:textSize="25sp"android:text="@string/app_name"/><TextViewandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:id="@+id/author"android:layout_weight="1"android:textSize="25sp"android:gravity="center_vertical"android:text="@string/app_name"/></LinearLayout>

三、java代码

MainActivity.java

package com.example.musicbox;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;public class MainActivity extends AppCompatActivity implements OnClickListener {// 获取界面中显示歌曲标题、作者文本框TextView title, author;// 播放/暂停、停止按钮ImageButton play, stop;ActivityReceiver activityReceiver;public static final String CTL_ACTION = "org.xr.action.CTL_ACTION";public static final String UPDATE_ACTION = "org.xr.action.UPDATE_ACTION";// 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;String[] titleStrs = new String[] { "Legends Never Die", "等你下课", "告白气球" };String[] authorStrs = new String[] { "英雄联盟", "周杰伦", "周杰伦" };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取程序界面界面中的两个按钮play = (ImageButton) this.findViewById(R.id.play);stop = (ImageButton) this.findViewById(R.id.stop);title = (TextView) findViewById(R.id.title);author = (TextView) findViewById(R.id.author);// 为两个按钮的单击事件添加监听器play.setOnClickListener(this);stop.setOnClickListener(this);activityReceiver = new ActivityReceiver();// 创建IntentFilterIntentFilter filter = new IntentFilter();// 指定BroadcastReceiver监听的Actionfilter.addAction(UPDATE_ACTION);// 注册BroadcastReceiverregisterReceiver(activityReceiver, filter);Intent intent = new Intent(this, MusicService.class);// 启动后台ServicestartService(intent);}// 自定义的BroadcastReceiver,负责监听从Service传回来的广播public class ActivityReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 获取Intent中的update消息,update代表播放状态int update = intent.getIntExtra("update", -1);// 获取Intent中的current消息,current代表当前正在播放的歌曲int current = intent.getIntExtra("current", -1);if (current >= 0){title.setText(titleStrs[current]);author.setText(authorStrs[current]);}switch (update){case 0x11:play.setImageResource(R.drawable.play);status = 0x11;break;// 控制系统进入播放状态case 0x12:// 播放状态下设置使用暂停图标play.setImageResource(R.drawable.pause);// 设置当前状态status = 0x12;break;// 控制系统进入暂停状态case 0x13:// 暂停状态下设置使用播放图标play.setImageResource(R.drawable.play);// 设置当前状态status = 0x13;break;}}}@Overridepublic void onClick(View source) {// 创建IntentIntent intent = new Intent("org.xr.action.CTL_ACTION");switch (source.getId()){// 按下播放/暂停按钮case R.id.play:intent.putExtra("control", 1);break;// 按下停止按钮case R.id.stop:intent.putExtra("control", 2);break;}// 发送广播,将被Service组件中的BroadcastReceiver接收到sendBroadcast(intent);}
}

MusicService.java

package com.example.musicbox;import java.io.IOException;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.IBinder;public class MusicService extends Service {MyReceiver serviceReceiver;AssetManager am;String[] musics = new String[] { "wish.mp3", "promise.mp3", "beautiful.mp3" };MediaPlayer mPlayer;// 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;// 记录当前正在播放的音乐int current = 0;@Overridepublic IBinder onBind(Intent intent) { return null; }@Overridepublic void onCreate() {super.onCreate();am = getAssets();// 创建BroadcastReceiverserviceReceiver = new MyReceiver();// 创建IntentFilterIntentFilter filter = new IntentFilter();filter.addAction(MainActivity.CTL_ACTION);registerReceiver(serviceReceiver, filter);// 创建MediaPlayermPlayer = new MediaPlayer();// 为MediaPlayer播放完成事件绑定监听器mPlayer.setOnCompletionListener(new OnCompletionListener() // ①{@Overridepublic void onCompletion(MediaPlayer mp){current++;if (current >= 3){current = 0;}//发送广播通知Activity更改文本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);// 准备并播放音乐prepareAndPlay(musics[current]);}});}public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(final Context context, Intent intent) {int control = intent.getIntExtra("control", -1);switch (control){// 播放或暂停case 1:// 原来处于没有播放状态if (status == 0x11){// 准备并播放音乐prepareAndPlay(musics[current]);status = 0x12;}// 原来处于播放状态else if (status == 0x12){// 暂停mPlayer.pause();// 改变为暂停状态status = 0x13;}// 原来处于暂停状态else if (status == 0x13){// 播放mPlayer.start();// 改变状态status = 0x12;}break;// 停止声音case 2:// 如果原来正在播放或暂停if (status == 0x12 || status == 0x13){// 停止播放mPlayer.stop();status = 0x11;}}// 广播通知Activity更改图标、文本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra("update", status);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);}}private void prepareAndPlay(String music) {try {// 打开指定音乐文件AssetFileDescriptor afd = am.openFd(music);mPlayer.reset();// 使用MediaPlayer加载指定的声音文件。mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());// 准备声音mPlayer.prepare();// 播放mPlayer.start();}catch (IOException e){e.printStackTrace();}}
}

四、运行界面展示



五、 源码GitHub的地址:

链接: https://github.com/zoushuoyu/music-box.

使用Android Studio编写一个简单的音乐盒相关推荐

  1. Android开发:基于Android Studio编写一个简单的账本

    目录 前言 用户注册/登录 新建资金记录 查询当前用户的所有资金记录 demo界面展示 后记 前言 最近在写的程序涉及到了用户注册/登录.SQLite数据库操作.因此将编写的代码整理了一下,写了一个简 ...

  2. 【Android】Android studio做一个简单的图片浏览器

    我们现在布局文件中定义一个简单的线性布局容器,代码如下 activity_main.xml <?xml version="1.0" encoding="utf-8& ...

  3. 用Android Studio设计一个简单个性的登录界面

    一.用到的组件: LinearLaout.TableLayout.FrameLayout.RelativeLout 二.效果图展示: 三.步骤及过程: 1.首先新建一个Project,并在app -& ...

  4. 如何使用Android Studio发送一个简单的GET/POST网络请求

    Android Studio发送简单的GET/POST网络请求 阅读文章需知 前提准备 权限添加 启动子线程,发送网络请求 POST请求如何添加参数? 后文必读 能点赞投币一键三连嘛? 阅读文章需知 ...

  5. 使用Android studio做一个简单的网站APP

    1.首先创建一个空白Android项目 2.然后打开项目,切换为Android视图,这时候会看到三个文件夹,分别是manifests.java.res.首先修改res/layout下的activity ...

  6. 用android studio写一个简单的记单词?????App

    一个贼贼简单的APP,按照前端来说,就只是实现了几个页面跳转和点击事件,数据库链接都没用到.就这么几个简单的页面和跳转,各位见笑了. 看一下效果吧: 页面设计(activity_main): < ...

  7. Android Studio编写一个手写字体识别程序

    1.activity_main.xml 的代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  8. Android Studio:一个简单的米英尺单位转化app的实现过程

  9. 如何使用android studio制作一个阿里云物联网APP

    摘要:要想学会物联网技术,需要掌握的知识真的有太多了,其中一个关键的技能,也是决定物联网技能等级的,就是移动端开发能力.当然,现在有很多平台都提供了各种各样的移动端应用,但是都相对封闭,我们无法掌握其 ...

最新文章

  1. Nginx-Nginx配置文件详细说明
  2. WebAPI(part6)--自定义属性操作
  3. ZOJ 3228(AC自动机+修改的匹配)
  4. html5 loaded,How do you check if a HTML5 audio element is loaded?
  5. 《南溪的目标检测学习笔记》——验证模式下出现“Process finished with exit code 137 (interrupted by signal 9: SIGKILL)“的问题
  6. 米思齐_米思齐公益培训之交互式图形设计与数据分析圆满落幕
  7. Mac 2016 运行Emacs,M-x键失效问题
  8. Maven的核心笔记(3)常用命令、坐标和仓库
  9. leetcode Candy
  10. python刷b站视频浏览量_python刷B站播放量
  11. C语言学习--------修改控制台输出文字颜色
  12. springboot医疗管理系统 毕业设计-附源码015221
  13. Deep Speech笔记
  14. 华为擎云G540笔记本怎么U盘重装电脑系统详细教学
  15. 使用 wpa_supplicant
  16. ubuntu 18.04中的shutter无法编辑截图
  17. taro 请务必在小程序页面中完善页面基础信息_小程序自定义导航栏(完美适配所有手机)...
  18. 计算机组成原理课程作业,兰大网院17春计算机组成原理课程作业 C.doc
  19. Oracle11g限制指定IP访问
  20. 蓝桥杯 2n皇后(java递归回溯)

热门文章

  1. Spring Boot 整合 Spring Data JPA
  2. 文件头格式标准魔数-magic number和mime.types
  3. 华硕天选4和联想拯救者r9000p选哪个好
  4. 爱签电子合同怎么签,应该注意哪些问题?
  5. 小程序复用公众号资质快速认证
  6. weblogic 打补丁
  7. 火车售票管理系统 问题陈述和词汇表
  8. 历史沿革:NFTs在以太坊上的发展之路
  9. 北航计算机网络安全,李舟军
  10. 初学者c语言编程软件_C初学者手册:仅需几个小时即可学习C编程语言基础知识