【Android】基于Service组件的简易音乐播放器

来源:互联网 发布:淘宝商店如何开通花呗 编辑:程序博客网 时间:2024/05/16 04:56

BroadcastReceiver是一种全局监听器,可以让不同组件之间进行通信。下面展示一个基于Service组件的音乐盒,音乐由后台运行的service组件播放,当后台播放状态改变时,通过发送广播通知前台Activity更新界面;当用户单击前台Activity界面按钮,发送广播通知后台Service改变播放状态。

  

MainActivity代码:

public class MainActivity extends Activity implements View.OnClickListener {    ImageButton play, stop;    TextView name, author;    String[] names = new String[]{"美丽新世界","约定","心愿"};    String[] authors = new String[]{"伍佰","周蕙","无名氏"};    public static final String CTL_ACTION = "com.yy.action.CTL_ACTION";    public static final String UPDATE_ACTION = "com.yy.action.UPDATE_ACTION";    ActivityReceiver activityReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        play = (ImageButton) findViewById(R.id.play);        stop = (ImageButton) findViewById(R.id.stop);        name = (TextView) findViewById(R.id.name);        author = (TextView) findViewById(R.id.author);        play.setOnClickListener(this);        stop.setOnClickListener(this);                //注册BroadcaReceiver        activityReceiver = new ActivityReceiver();        IntentFilter filter = new IntentFilter(UPDATE_ACTION);        registerReceiver(activityReceiver,filter);                Intent intent = new Intent(MainActivity.this, MusicService.class);        startService(intent); //启动Service    }    //自定义BroadcastReceiver,负责监听从Service传回来的广播    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);            name.setText(names[current]);            author.setText(authors[current]);            switch (update){                case 0x11:                    play.setImageResource(R.drawable.play);                    break;                case 0x12:                    play.setImageResource(R.drawable.pause);                    break;                case 0x13:                    play.setImageResource(R.drawable.play);                    break;            }        }    }        @Override    public void onClick(View v) {       Intent intent = new Intent(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);    }}

Service代码:

public class MusicService extends Service {    String[] musics = new String[]{"beautiful.mp3","promise.mp3","wish.mp3"};    AssetManager am;    MediaPlayer mPlayer;    ServiceReceiver serviceReceiver;    int status = 0x11; //0x11没有播放,0x12正在播放,0x13暂停    int current = 0;    @Override    public IBinder onBind(Intent intent) {        return null;    }    public class ServiceReceiver 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]);                        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);            sendBroadcast(sendIntent);        }    }    private void prepareAndplay(String music) {        try {            AssetFileDescriptor afd = am.openFd(music);            mPlayer.reset();            mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());            mPlayer.prepare();            mPlayer.start();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void onCreate(){        super.onCreate();        am = getAssets();        mPlayer = new MediaPlayer();        serviceReceiver = new ServiceReceiver();        IntentFilter filter = new IntentFilter(MainActivity.CTL_ACTION);        registerReceiver(serviceReceiver,filter); //注册BroadcastReceiver        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {            @Override            public void onCompletion(MediaPlayer mp) {                current ++;                if(current >=3)                    current = 0;                prepareAndplay(musics[current]);                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);                sendIntent.putExtra("current",current);                sendBroadcast(sendIntent);            }        });    }}


0 0
原创粉丝点击