基于BrocastReceiver的简易音乐播放

  虽然说这些话不应该讲,但是我只是小小的发一下牢骚,权当发泄吧:自己已经有点适应这样的编码的日子了,甚至非常想要花上一段时间痛快的写一个应用,但是日常的学习的生活还是比较忙率的,而且 最近也听一些讲座,有了很深的启发,归结一点,我觉得比我们年长的程序员对于我们这样的初步的学者还是应该有宽容之心的,但是看到状况还是心中有些难平啊,但是某些评论并不能成为我的阻碍,我还是简单的想要保持一颗简单想要对未知的编码的世界一探究竟的心。

好了言归正传,最近我一直在想着把我的音乐播放器更进一步,所以就我最近的小小的收获写到这里吧。

  在上一次的Service的基础上,这次做了“小小”的改进,这里还是专指我需要做的播放器类的Service服务——BrocastReceiver。首先是介于上一次的程序的考虑,如果仅仅是需要一次服务的话,那么我们仅仅需要 在后台启动Service后就没有任何问题,但是这样的Service存在很大的隐患——不能和前台的Activity进行数据的交互,换言之就没有实时的信息,比如我们启动音乐和关闭音乐不仅音乐需要关闭,同时前台也需要更新状态显示音乐的播放或是暂停。这就需要借助于BrocastReceiver来完成通信。

下面是一个简单的MusicBox的演示,这里只是强调功能以及用法完全不涉及其他的界面的考虑。

程序需要使用的Brocastreceiver只需要两步就能够开始启动和注册了。

(1)创建需要启动的Brocastreceiver的Intent。

(2)调用Context的sendBrocast()来指定对应的BrocastReceiver

这些都会在下面的程序中有所体现。需要注意的是当一个程序发出了Brocast  Intent之后,所有匹配该Intent的BrocastReceiver都会被启动。

而在实际的理解过程中可以把Brocastreceiver理解为监听器,而要在程序中完成相应的信息的通信,就需要利用Brocast intent来指定,有两种方式:

1.通过在AndroidManifest.xml文件中进行指定:

<receiver android:name=”.xxxxxxReceiver”>

<intent-filter>

<action  android:name=””>

</intent-filter>

</receiver>

2.通过代码指定

通常是调用BroadcastReceiver的registerReceiver(BrocastReceiver activityReceiver, IntentFilter filter)方法来进行注册绑定,这也是本次博客主要要使用的方法,比较灵活。

下面需要通过一个基于BroadcastReceiver的音乐程序,来阐明service和activity的调用关系。

程序的Service后台负责音乐的播放,当音乐的播放状态需要改变时,可以通过前台的按钮的触发事件来发送消息通知service来改变播放状态。

(一)程序的activity部分较为简单,分为两块:

先看着整体的代码:

package com.musicbox;

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;

public class MusicBox extends Activity implements OnClickListener{

    //界面中的歌曲标题、作者文本框
    TextView title,author;
    //播放、暂停按钮
    ImageButton play,stop;
    //
    ActivityReceiver activityReceiver=null ;
    //?
    public static final String CTL_ACTION =
            "org.crazyit.action.CTL_ACTION";
    public static final String UPDATE_ACTION =
            "org.crazyit.action.UPDATE_ACTION";
    //定义音乐的状态  0x11没有播放  0x12正在播放  0x13停止播放
    int status=0x11;
    //歌曲
    String[] titleStrs=new String[]{"心愿","约定","我"};
    //演唱
    String[] authorStrs=new String[]{"ll","zz","ss"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music_box);

        play=(ImageButton)findViewById(R.id.play);
        stop=(ImageButton)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();

        //创建IntentFilter(IntentFilter对象负责过滤掉组件无法响应和处理的Intent)
        IntentFilter filter=new IntentFilter();
        //指定BrocastReceive监听的Action
        filter.addAction(UPDATE_ACTION);
        //注册
        registerReceiver(activityReceiver, filter);
        Intent intent=new Intent(this,music_service.class);
        //启动Service(后台)
        startService(intent);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        //向service发送数据
        Intent intent =new Intent("org.crazyit.action.CTL_ACTION");
        switch(v.getId())
        {
        //按下播放/暂停按钮
        case R.id.play:
            intent.putExtra("control", 1);
            break;
        //按下停止按钮
        case R.id.stop:
            intent.putExtra("control", 2);
            break;
        }
        sendBroadcast(intent);
    }

    //自定义BroadcastReceiver,负责监听Service传回的广播
    public class ActivityReceiver extends BroadcastReceiver
    {

        @Override
        public void onReceive(Context content, Intent intent) {
            // TODO Auto-generated method stub
            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:
                play.setImageResource(R.drawable.play);
                status =0x11;
                break;

            case 0x12:
                play.setImageResource(R.drawable.pause);
                status= 0x12;
                break;

            case 0x13:
                play.setImageResource(R.drawable.stop);
                status=0x13;
                break;
            }
        }
    }

}

其中在activity的OnCreated()方法中指定了Brocast intent,这样就绑定了前台的BroadcastReceiver可以用来接收后台service传过来的的信息:

IntentFilter filter=new IntentFilter();

//指定BrocastReceive监听的Action

filter.addAction(UPDATE_ACTION);

//注册

registerReceiver(activityReceiver, filter);

Intent intent=new Intent(this,music_service.class);

//启动Service(后台)

startService(intent);

同时通过Button的OnClick事件来触发播放和暂停的控制给后台:

public void onClick(View v) {
        // TODO Auto-generated method stub

        //向service发送数据
        Intent intent =new Intent("org.crazyit.action.CTL_ACTION");
        switch(v.getId())
        {
        //按下播放/暂停按钮
        case R.id.play:
            intent.putExtra("control", 1);
            break;
        //按下停止按钮
        case R.id.stop:
            intent.putExtra("control", 2);
            break;
        }
        sendBroadcast(intent);
    }

在代码中自定义BroadcastReceiver,负责监听Service传回的广播.

(二)与之对应的后台的Service的,整体的代码为:

package com.musicbox;

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 music_service extends Service {

    AssetManager am;  //android资源管理框架(这里是音乐文件存储)
    String[] musics =new String[]{"wish.mp3","promise.mp3"
            ,"beautiful.mp3"};
    MediaPlayer mPlayer;
    MyReceive serviceReceiver;
    //当前状态  0x11没有播放  0x12正在播放  0x13停止播放
    int status=0x11;
    //记录当前正在播放放的音乐
    int current=0;
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        am= getAssets();
        //创建BroadcastReceiver
        serviceReceiver=new MyReceive();
        mPlayer =new MediaPlayer();
        IntentFilter filter=new IntentFilter();
        filter.addAction(MusicBox.CTL_ACTION);
        registerReceiver(serviceReceiver,filter);

        //MediaPlayer播放完成监听事件
        mPlayer.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub

                current++;
                if(current>= 3)
                {
                    current=0;
                }
                //通知activity 修改文本框(author..content)
                Intent sendIntent=new Intent(MusicBox.UPDATE_ACTION);

                sendIntent.putExtra("current",current);
                //发送广播
                sendBroadcast(sendIntent);
                //
                prepareAndPlayer(musics[current]);
            }
        });
        super.onCreate();
    }

    public class MyReceive extends BroadcastReceiver
    {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub

            int control =intent.getIntExtra("control", -1);

            switch(control)
            {
            //播放或暂停
            case 1:
                if(status ==0x11)
                {
                    //准备并播放音乐
                    prepareAndPlayer(musics[current]);
                    status=0x12; //change status
                }
                //原来处于播放状态
                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;
                }
                break;
            }
            //广播通知Activity 更改图标
            Intent sendIntent =new Intent(MusicBox.UPDATE_ACTION);
            sendIntent.putExtra("update",status );
            sendIntent.putExtra("current", current);

            //发送广播,将被broadcast接收到
            sendBroadcast(sendIntent);
        }

    }

    //播放音乐
    private void  prepareAndPlayer(String music)
    {
        try {

            //打开指定的音乐文件
            AssetFileDescriptor  afd=am.openFd(music);
            mPlayer.reset();

            //使用MediaPlayer加载指定声音
            mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
            //准备声音
            mPlayer.prepare();
            //播放
            mPlayer.start();

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

同样通过

IntentFilter filter=new IntentFilter();

filter.addAction(MusicBox.CTL_ACTION);

registerReceiver(serviceReceiver,filter);

  

来绑定service与BroadcastReceiver,用来接收前台activity传来的内容。当播放状态改变时(歌曲轮换)service会发送信息被前台service接收,前台service会相应的改变当前的状态。

可以看到程序由于注册了两个BroadcastReceiver的IntentFilter所以就无需在AndroidManifest.xml文件中进行指定。同时程序利用了Service所以支持了程序的音乐后台播放。

(三)程序运行效果:

程序虽然简单,但也确实为我打下一个写service的基础吧,接下来我就可以继续完成我的音乐播放器了。

  日进一小步,月过一大步~~加油!!!

时间: 2024-10-23 15:56:47

基于BrocastReceiver的简易音乐播放的相关文章

简易音乐播放器制作

制作简易音乐播放器: 1.功能:音乐列表,播放,暂停,上一曲,下一曲,进度条(显示进度时间,控制进度),随机播放,单曲循环,顺序播放,歌词显示等 2.使用框架:AVFoundation 3.知识点:AVPlayer 使用,pch 文件使用,封装思想,MVC模式,storyBoard的使用,消息发送机制,观察者,block回调,nstimer,nsrunloop,空间约束,第三方使用等 详细过程: 一.布局 :使用 storyBoard 布局 1.歌曲列表界面:使用 TableViewContro

Android学习之旅--简易音乐播放器实现之前期准备

学习Android有两个月了,感觉现在进入一个瓶颈--基础知识了解,但是不能灵活运用.我想这是所有新手学习android时都会遇到的 问题,所以打算做一个简易音乐播放器的小项目,这也是特别适合新手的练习项目.虽然小,但是也能考察不少东西.前几天看到一句话-----编 程不仅是一种知识,更是一种技能.既然是技能,那就需要不断练习才能熟练掌握. 项目目标前期实现本地音乐的播放,后期会往网络音乐方面发展,如果进行顺利的话,我会将源码放在github上,欢迎各位大神指导^- ^.我会坚持每天一更,记录每

基于jQuery仿QQ音乐播放器网页版代码

基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m_player" id="divplayer" role="application" onselectstart="return false" style="left: 0px;"> <div class=&

iso 开发学习--简易音乐播放器(基于iPhone4s屏幕尺寸)

三个按钮  一个进度条 贴图(软件中部分图片,来自网络,如果侵犯了您的权益,请联系我,会立刻撤下) 核心代码 // // ViewController.m // 08-10-MusicPlayer // // Created by Ibokan on 15/8/10. // Copyright (c) 2015年 Crazy凡. All rights reserved. // #import "ViewController.h" #import <AVFoundation/AVF

基于Vue2.0的音乐播放器——歌手模块(拿不到数据)

来这里的都可能在看,慕课网vue2.0 的音乐播放器的相关页面,如果使用视频介绍的方法,相当于现在来说是获取数据回报如下的错误: {code: -500001, ts: 1529809544209} code : -500001 ts : 1529809544209 原因也简单:最新的vue2.0 webpack模板中没有dev-server.js文件,进行后台数据的模拟获取,只需要使用从接口获取数据后放在本地进行代理,页面就能拿到代理的数据了具体操作如下: before(app) { app.

Android 简易音乐播放器

效果图: 1.获取本地音乐 2.播放音乐 MediaPlayer 音乐播放类 MediaPlayer其实是一个封装的很好的音频.视频流媒体操作类,如果查看其源码,会发现其内部是调用的native方法,所以它其实是有C++实现的. 既然是一个流媒体操作类,那么必然涉及到,播放.暂停.停止等操作,实际上MediaPlayer也为我们提供了相应的方法来直接操作流媒体. void statr():开始或恢复播放. void stop():停止播放. void pause():暂停播放. 通过上面三个方法

QMediaplayer详解以及简易音乐播放实现

QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,设计到的对象为QMediaContent.QMediaObject可以提供关于媒体内容的接入,通过URL进行初始化,同时也可以提供可以播放的媒体文件的列表,与QMediaplayer对象息息相关.使用QMediaplayer,除了需要添加必要的头文件之外,还需要在.pro(Qt的工程配置文件)添加QT += multimedia.下面解析有关QMediaplayer的相关知识. Type Informatio

Android基于发展Service音乐播放器

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

基于web的html 5的音乐播放器(转载)

文章转载自:开源中国社区 [http://www.oschina.net] 想通过手机客户端(支持 Android.iPhone 和 Windows Phone)访问开源中国:请点这里 HTML5 是一种用于创建和呈现的网页内容的语言.这是一个革命性的语言,它拥有一些真正棒的功能和一个新的HTML5规范允许本地音频流的播放.本文向你推荐 10 个最棒的 HTML5 音频播放器,看看你喜欢哪个! Speakker Speakker 是一个基于 Web 浏览器的音乐播放器,只提供很多高级播放功能包括