码迷,mamicode.com
首页 > 其他好文 > 详细

使用BroadcastReceiver的音乐播放器

时间:2015-01-25 00:09:33      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

  广播是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);

使用BroadcastReceiver的音乐播放器

标签:

原文地址:http://www.cnblogs.com/fishbone-lsy/p/4246818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!