使用BroadcastReceiver的音乐播放器

  广播是Andorid的全局监听器,用于监听全局的广播消息。因此,它可以非常方便地实现系统中不同组件之间的通信。本例将展示通过使用BroadcastReceiver在Activity和Service之间进行通信。UI界面只管界面,并不对音乐的播放进行操作。当用户操作UI时,Activity只是改变UI,并向Service发出广播。接收到广播的Service根据广播的内容,做出相应的操作。同时,Service的状态发生改变时,也会向Activity发出广播,Activity根据广播的内容改变界面。

  Activity的属性有:

    String[] titleStrs = new String[]{"心愿", "约定", "美丽新世界"};
    String[] authorStrs = new String[]{"未知艺术家", "周蕙", "伍佰"};
    TextView title, author;
    Button playbt, stopbt,nextbt,previousbt;
    ActivityReceiver myReceiver;
    int status=0x11;                    //音乐后台状态,0x11未播放,0x12正在播放,0x13暂停中

  Activity中的主要内容分为四部分:

  一、获取组件界面组件ID,并注册按键的监听事件

        //组件ID获取
        player=new MediaPlayer();
        playbt = (Button) findViewById(R.id.playbt);
        stopbt = (Button) findViewById(R.id.stopbt);
        nextbt= (Button) findViewById(R.id.nextbt);
        previousbt = (Button) findViewById(R.id.previousbt);
        title = (TextView) findViewById(R.id.musictitle);
        author = (TextView) findViewById(R.id.musicauthor);
        listView = (ListView) findViewById(R.id.musiclist);
        playbt.setOnClickListener(this);
        stopbt.setOnClickListener(this);
        nextbt.setOnClickListener(this);
        previousbt.setOnClickListener(this);

  二、重写按键的监听方法

    //所有button单击触发事件
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com,memeda.lsy.action.CTRL_ACTION");
        switch (v.getId()) {
            case R.id.playbt:
                intent.putExtra("control", 1);
                break;
            case R.id.stopbt:
                intent.putExtra("control", 2);
                break;
            case R.id.nextbt:
                intent.putExtra("control", 3);
                break;
            case R.id.previousbt:
                intent.putExtra("control", 4);
                break;
        }
        sendBroadcast(intent);
    }

将广播意图内容定为 "com,memeda.lsy.action.CTRL_ACTION"

根据触发点击监听事件的事件源的ID,给出不同的广播。

  三、创建Activity的监听类

    //所有接收广播事件处理
    public class ActivityReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            int update = intent.getIntExtra("update", -1);
            int current = intent.getIntExtra("current", -1);
            if (current >= 0) {
                title.setText(titleStrs[current]);
                author.setText(authorStrs[current]);
            }
            switch (update) {
                case 0x11:
                    playbt.setText("播放");
                    status=0x11;
                    break;
                case 0x12:
                    playbt.setText("暂停");
                    status=0x12;
                    break;
                case 0x13:
                    playbt.setText("播放");
                    status=0x13;
                    break;
            }
        }
    }

  提取接收广播中的updatecurrent的数据,其中update表示当前播放器的播放状态,根据该状态,改变UI。如在播放中时,播放键应该变为暂停标志;而在暂停时播放标志为正常的播放标志。而current表示当前播放的是第几首歌,Activity需要根据它来决定UI界面上显示的歌名和作者。

  四、注册广播监听者,然后开启Service后台

        //注册广播接收器
        myReceiver = new ActivityReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.memeda.lsy.UPDATE_ACTION");
        registerReceiver(myReceiver, intentFilter);
        //开启音乐播放后台
        Intent intent = new Intent(this,MusicPlay.class);
        startService(intent);

  此处将intentFilter设为"com.memeda.lsy.UPDATE_ACTION",即后台的广播需要以这样的意图内容发出时,Activity才能监听到。

  Service后台由三部分组成:

  一、创建音频管理器,并为其播放完成创建监听,因为我们需要自动切歌~

        MediaPlayer mediaPlayer;
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                current++;
                if(current>=3){
                    current=0;
                }
                Intent intent = new Intent("com.memeda.lsy.UPDATE_ACTION");
                intent.putExtra("current",current);
                sendBroadcast(intent);
                prepareAndPlay(musics[current]);

            }
        });

  当然某首歌播放完成时,current+1进入下一首,并发出广播通知Activity,更改UI界面的歌名显示。

  二、创建Service的广播监听方法

    public class MusicPlayReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

            int control = intent.getIntExtra("control",-1);
            switch (control){
                case 1:
                    if(status==0x11){
                        prepareAndPlay(musics[current]);  //播放Asset音乐
                        status=0x12;
                    }
                    else if(status==0x12){
                        mediaPlayer.pause();
                        status=0x13;
                    }
                    else if(status==0x13){
                        mediaPlayer.start();
                        status=0x12;
                    }
                    break;
                case 2:
                    if (status==0x12 || status==0x13){
                        mediaPlayer.stop();
                        status=0x11;
                    }
                    break;
                case 3:
                    current++;
                    if(current>=3){
                        current=0;
                    }
                    if (status==0x11 || status==0x13){
                        mediaPlayer.stop();
                        status=0x12;
                        prepareAndPlay(musics[current]);
                    }
                    else if(status==0x12){
                        mediaPlayer.stop();
                        prepareAndPlay(musics[current]);
                    }
                    break;
                case 4:
                    if(current>0){
                        current--;
                    }else current=2;
                    if (status==0x11 || status==0x13){
                        mediaPlayer.stop();
                        status=0x12;
                        prepareAndPlay(musics[current]);
                    }
                    else if(status==0x12){
                        mediaPlayer.stop();
                        prepareAndPlay(musics[current]);
                    }
                    break;
            }
            Intent sendIntent = new Intent("com.memeda.lsy.UPDATE_ACTION");
            sendIntent.putExtra("update",status);
            sendIntent.putExtra("current",current);
            sendBroadcast(sendIntent);
        }
    }

  其中case1是播放/暂停,case2是停止播放,case3是下一首,case4是上一首。Service的动作完成后,后台还需将自己的变化写成广播发往Activity通知它改变UI。

  三、注册Service的监听器

        musicPlayReceiver = new MusicPlayReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com,memeda.lsy.action.CTRL_ACTION");
        registerReceiver(musicPlayReceiver,intentFilter);

  以上。

  

 

musicPlayReceiver = new MusicPlayReceiver();        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("com,memeda.lsy.action.CTRL_ACTION");        registerReceiver(musicPlayReceiver,intentFilter);

时间: 2024-12-27 20:43:54

使用BroadcastReceiver的音乐播放器的相关文章

Android开发6:Service的使用(简单音乐播放器的实现)

前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service 进行后台工作, 学会使用 Service 与 Activity 进行通信,并在此知识基础上学会使用 MediaPlayer和简单的多线程编程.使用 Handle 更新 UI,并设计成功一个简单的音乐播放器. 是不是很高大上呢~一起来学习~ 基础知识 Service作为Android四大组件之一,在每

实践--音乐播放器

话不多说,先上效果图 这里由于模拟器的适配不太好,一些显示的细节并不如意,在我的手机上就都能实现功能 比如我每次打开软件是一张图片,后台执行筛选音乐文件,模拟器上却不显示图片 我每次放歌都有个Notification告诉我在放哪一首,然后消失,模拟器上却也不不显示 基本细节就是这些吧,这个软件运行在手机上效果更理想一些. 基本思路 音乐播放器其实就是应用了Activity,Service和BroadcaReceiver这三个组件,再配合MediaPlayer的使用,完成各种逻辑的设计,就可以实现

Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)

1.回顾 上篇 学习了 Android的四大组件之一 BroadCastReceiver 的 相关知识 2.重点 (1)Service 分类 (2)Service 的生命周期 (3)Service 标签 下的属性 (4)什么时候使用BindService 和 startService ? (5)实例 - 通过Service 服务 实现 音乐播放器 后台播放 3.Service 分类 3.1 按照地点分 (1)本地服务 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local

手把手教你做音乐播放器(八)桌面小工具(下)(完)

8.4 MusicService的改造 8.4.1 App widget触发MusicService 当App widget的按钮被点击后,会触发隐式定义的Intent发送给MusicService.例如当下一首按钮被点击后,携带action-MusicService.ACTION_PLAY_MUSIC_NEXT的Intent将触发MusicService的onStartCommand()函数. 我们可以在onStartCommand()函数当中接收到App widget要求的操作命令,进行相应

Android基于发展Service音乐播放器

这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activity的界面button或拖动进度条时,系统通过发送广播通知后台Service来改变播放状态和播放指定音乐. 程序执行效果图:         watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3l1emhlbmdmYW4=/font/5a6L5L2T/

基于Service的音乐播放器

这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activity的界面按钮或拖动进度条时,系统通过发送广播通知后台Service来改变播放状态和播放指定音乐. 程序运行效果图:         程序代码: 程序界面类(MusicBox.java): package com.jph.musicbox; import com.jph.util.ConstUtil;

Android实现音乐播放器(一)

Graphical User Interface 本篇文章记录了我实现Android简单音乐播放器的过程,(一)中介绍了怎么构建音乐播放器的前端页面.首先大家看一下,界面最后是这样的(界面有点粗陋) 音乐文件列表是从SD卡中读取出来的. 首先我们先在Layout里面创建Music Player的GUI,diagram如下图所示: 根据diagram我们在activity_main.xml写出如下代码: <LinearLayout xmlns:android="http://schemas.

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

毕业设计——基于STM32的音乐播放器设计(一)

基于STM32的音乐播放器设计, 源代码下载地址:http://download.csdn.net/detail/cxp2205455256/8334021      SD卡文件下载地址:http://download.csdn.net/detail/cxp2205455256/8334089 电路图下载地址:文件太大了,上传不了....... 以下是截图: 1.硬件电路 2.软件主界面 3.音乐播放器界面 4.音乐定时播放界面 5.音乐列表界面 6.日历功能界面 9.温度功能界面 10.计算器