Service混合开发播放音乐 //借鉴

来源:互联网 发布:网页游戏传奇源码下载 编辑:程序博客网 时间:2024/05/21 15:47

-----------------------------------------------------Service-------------------------------------------------------

private MediaPlayer mp;

    IBinder b = new MyBinder(); // 给接口赋值,通过创建接口的实现类
    // 中间人,定义一种功能
    public class MyBinder extends Binder {
        // 中间人有启动音乐功能(start)
        public void start() {
            MusicService.this.start11(); //
        }
        public void pause() {
            MusicService.this.pause11(); // 调用服务的暂停
        }
    }
    /**
     * onBind----------->通过bindService的启动方式时,会调用
     * 返回值IBinder:作用Activity和Service的中间人
     */
    @Override
    public IBinder onBind(Intent intent) {
        // 获取资源根路径
        File fp = Environment.getExternalStorageDirectory(); // 获取sd卡目录
        Log.d("TAG", "++++++++" + fp.getPath()); // 获取 .../0 文件夹
        File music = new File(fp, "Music/horse.mp3");
        // 判断音乐文件路径
        Log.d("TAG", "music文件是否存在:++++++" + music.exists());

        try {
            // 播放本地音乐
            mp.setDataSource(music.getPath()); // 给播放器设置路径
            // 播放网络上的音乐
            // mp.setDataSource("www.");
            mp.prepare();

        } catch (IOException e) {
            e.printStackTrace();
        }
        
        Log.d("TAG", "service返回中间人:++++++++++++++"+b);

        return b;
    }
    
    @Override
    public void unbindService(ServiceConnection conn) {
        super.unbindService(conn);
        Log.d("TAG", "unbindService+++++++++++++++++++");
        if(mp!=null){
            mp.release();  //从内存里清除
            mp=null;
        }
    }

    // 创建音乐对象 new

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("TAG", "onCreate+++++++++++++++++++");
        mp = new MediaPlayer();
    }

    /**
     * 播放音乐,放在
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("TAG", "onStartCommand ++++++++++++++++++++++++");
        return super.onStartCommand(intent, flags, startId);
    }
    // 启动
    public void start11() {
        mp.start();
    }
    // 在服务中创建暂停方法
    public void pause11() {
        // 暂停音乐
        mp.pause();
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("TAG", "onDestroy ++++++++++++++++++++++++");

        if (mp != null) {
            mp.release();
            mp = null;
        }

    }


------------------------------------------------------------------------------Activity-----------------------------------------------------------------------------------------

private Button btn1;
    private Button btn2;
    private Intent service;
    // 绑定服务时,需要客户端(Activity)与服务建立连接对象
    private ServiceConnection conn;

    private MyBinder mb;   //中间人
    private boolean b;   //查看服务是否连接
    private Button btnbind;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = (Button) findViewById(R.id.start);
        btn2 = (Button) findViewById(R.id.stop);
        btnbind = (Button) findViewById(R.id.bind);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btnbind.setOnClickListener(this);
        
        // Intent作用: 1>Activity之间跳转 2>Activity开启广播 3>Activity开启服务
        service = new Intent(this, MusicService.class);

        // 给服务连接对象赋值
        conn = new ServiceConnection() {

            // 服务断开
            @Override
            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub

            }

            // 服务连接
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) { // 系统把中间人赋值service
                mb = (MyBinder) service;
                Log.d("TAG", "onServiceConnected:++++++++++++++++"+mb);
            }
        };

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bind:
            // 向使用startService:    oncreate---onStartCommand--->stopService():Service的生命周期才结束
            startService(service);
            // 使用bindService的目的:  获取中间人                     
            b = MainActivity.this.bindService(service, conn, BIND_AUTO_CREATE); // 绑定服务
            Log.d("TAG", "MainActivity:绑定服务:++++++++++"+b);
            break;
        case R.id.start:
            
            if (b) {
                mb.start();
            } else {
                Toast.makeText(this, " +++++服务未连接", 0).show();
            }
            break;
        case R.id.stop:
            // 停止服务
            mb.pause();
            break;
        default:
            break;
        }
    }
    
    //在Activity销毁时,调用解绑方法,
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        MainActivity.this.unbindService(conn);  //如果不调用,程序退出时,会在后台报异常
    }