【达内课程】音乐播放器4.0(音乐列表播放)

开发步骤:
1、编写 PlayMusicService 组件
重写 Service.onBind 方法,返回给客户端 IBinder 对象,客户端就可以使用该对象动态调用 service 中的某些业务方法

class MusicBinder extends Binder{
	声明客户端调用的方法
	playMusic()......
}

2、AndroidManifest.xml 中注册该 Service
3、Activity 中的 onCreate 方法中绑定该 Service:

conn = new ServiceConnection(){
	onServiceConnect(IBinder binder){
		//(MusicBinder)binder.playMusic()
		把 binder 对象交给两个 Fragment
	}
	onServiceDisConnected(){}
}
this.bindService(intent,conn,BIND_AUTO_CREATED)

4、在 Fragment 中接收 binder 对象,然后在合适的时机调用 binder.xx 方法执行业务

我们按照以上开发步骤编写代码:

创建 PlayMusicService


/**
 * 播放音乐服务
 */
public class PlayMusicService extends Service {
    //Service是单例的,只创建1次,因此在这里创建MediaPlayer,保证只有一个
    private MediaPlayer mediaPlayer = new MediaPlayer();

    /**
     * 当service实例创建时执行
     */
    @Override
    public void onCreate() {
        super.onCreate();
        //给mediaPlayer加监听
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            //音乐已经准备好
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MusicBinder();
    }

    public class MusicBinder extends Binder {
        //定义供客户端调用的方法
        public void playMusic(String url) {
            try {
                mediaPlayer.reset();
                mediaPlayer.setDataSource(url);
                mediaPlayer.prepareAsync();//异步准备
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

AndroidManifest.xml 对 service 进行注册

<service android:name=".service.PlayMusicService" />

Activity 中绑定 Service

public class MainActivity extends FragmentActivity {
    ......
    private ServiceConnection conn;

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

        setViews();
        //设置ViewPager适配器
        setViewPagerAdapter();
        //设置监听
        setListeners();
        //绑定Service
        bindMusicService();
    }

    /**
     * 绑定Service
     */
    private void bindMusicService() {
        Intent intent = new Intent(this, PlayMusicService.class);
        conn = new ServiceConnection(){

            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                PlayMusicService.MusicBinder binder = (PlayMusicService.MusicBinder)iBinder;
                //把binder对象交给Fragment
                NewMusicListFragment f1 = (NewMusicListFragment)fragments.get(0);
                f1.setMusicBinder(binder);
            }
            //绑定成功执行该方法
            @Override
            public void onServiceDisconnected(ComponentName componentName) {

            }
        };
        this.bindService(intent,conn, Service.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        this.unbindService(conn);
        super.onDestroy();
    }
	......
}

NewMusicListFragment 中调用 service 中播放音乐方法

/**
 * 新歌榜列表
 */
public class NewMusicListFragment extends Fragment {
    ......
    private PlayMusicService.MusicBinder binder;
	......
	private void setListeners() {
        listView.setOnItemClickListener((adapterView, view, i, l) -> {
            final MusicItem music = musics.get(i);
            String songId = music.id;
            Toast.makeText(getActivity(), "position:" + i, Toast.LENGTH_SHORT).show();
            //执行业务层 加载这首歌曲的基本信息
            model.loadMusicInfoBySongId(songId, new MusicInfoCallback() {
                @Override
                public void onMusicInfoLoaded(MusicItem musicItem) {
                    music.url = musicItem.url;
                    Log.d("TTT", music.url);
                    //准备通过url地址执行播放业务
                    //播放音乐
                    binder.playMusic(music.url);
                }
            });
        });
    } 

	public void setMusicBinder(PlayMusicService.MusicBinder binder){
        this.binder = binder;
    }
    
   ......
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值