建立PlayService服务
package com.iwanghang.drmplayer;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import .Uri;
import android.os.Binder;
import android.os.IBinder;
import com.iwanghang.drmplayer.utils.MediaUtils;
import com.iwanghang.drmplayer.vo.Mp3Info;
import java.io.IOException;
import java.util.ArrayList;
/**
* 音乐播放的服务组件
* 实现功能:
* 播放
* 暂停
* 下一首
* 上一首
* 获取当前歌曲的播放进度
*
* 需要在AndroidManifest.xml添加以下代码:
*
*android:name=".PlayService"
*android:enabled="true"
*android:exported="true">
*
*/
public class PlayService extends Service {
private MediaPlayer mPlayer;
private int currentPosition;//当前正在播放的歌曲的位置
ArrayList mp3Infos;
public PlayService() {
}
//内部类PlayBinder实现Binder,
class PlayBinder extends Binder{
public PlayService getPlayService(){
System.out.println("PlayService #1 " + PlayService.this);
return PlayService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return new PlayBinder();//通过PlayBinder拿到PlayService,给Activity调用
}
@Override
public void onCreate() {
super.onCreate();
mPlayer = new MediaPlayer();
mp3Infos = MediaUtils.getMp3Infos(this);//获取Mp3列表
}
//播放
public void play(int position){
if (position>=0 && position
Mp3Info mp3Info = mp3Infos.get(position);//获取mp3Info对象
//进行播放,播放前判断
try {
mPlayer.reset();//复位
mPlayer.setDataSource(this, Uri.parse(mp3Info.getUrl()));//资源解析,Mp3地址
mPlayer.prepare();//准备
mPlayer.start();//开始(播放)
currentPosition = position;//保存当前位置到currentPosition,比如第一首,currentPosition = 1
} catch (IOException e) {
e.printStackTrace();
}
}
}
//暂停
public void pause(){
if (mPlayer.isPlaying()){
mPlayer.pause();
}
}
//下一首
public void next(){
if (currentPosition>=mp3Infos.size()-1){//如果超出最大值,(因为第一首是0),说明已经是最后一首
currentPosition = 0;//回到第一首
}else {
currentPosition++;//下一首
}
play(currentPosition);
}
//上一首 previous
public void prev(){
if (currentPosition-1<0){//如果上一首小于0,说明已经是第一首
currentPosition = mp3Infos.size()-1;//回到最后一首
}else {
currentPosition--;//上一首
}
play(currentPosition);
}
//
public void start(){
if (mPlayer!=null && !mPlayer.isPlaying()){//判断当前歌曲不等于空,并且没有在播放的状态
mPlayer.start();
}
}
}
建立BaseActivity实现Demo中所有服务的绑定和解绑
package com.iwanghang.drmplayer;
import ponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.FragmentActivity;
/**
* Created by iwanghang on 16/4/19.
* MainActivity继承BaseActivity,实现APP所有绑定功能
* 继承后,直接调用子类方法,就可以进行绑定和解除,bindPlayService,unbindPlayService
*/
public class BaseActivity extends FragmentActivity{
protected PlayService playService;
private boolean isBound = false;//是否已经绑定
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//绑定Service
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//转换
PlayService.PlayBinder playBinder = (PlayService.PlayBinder) service;
playService = playBinder.getPlayService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
playService = null;
isBound = false;
}
};
//绑定服务
public void bindPlayService(){
if(!isBound) {
Intent intent = new Intent(this, PlayService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
isBound = true;
}
}
//解除绑定服务
public void unbindPlayService(){
if(isBound) {
unbindService(conn);
isBound = false;
}
}
}
在欢迎页面中启动服务
//在欢迎界面启动服务
//先将服务器启动起来,然后进行绑定和解除绑定,服务不会被结束;否则,解除绑定是,服务会自动被回收
startService(new Intent(this,PlayService.class));
在MyMusicListFragment中绑定和解绑PlayService服务
首先继承OnItemClickListener
public class MyMusicListFragment extends Fragment implements AdapterView.OnItemClickListener
package com.iwanghang.drmplayer;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import com.iwanghang.drmplayer.adapter.MyMusicListAdapter;
import com.iwanghang.drmplayer.utils.MediaUtils;
import com.iwanghang.drmplayer.vo.Mp3Info;
import java.util.ArrayList;
/**
* Created by iwanghang on 16/4/16.
*/
public class MyMusicListFragment extends Fragment implements AdapterView.OnItemClickListener {
//public class MyMusicListFragment extends Fragment {
private ListView listView_my_music;
private ArrayList mp3Infos;
private MyMusicListAdapter myMusicListAdapter;
private MainActivity mainActivity;
//onAttach(),当fragment被绑定到activity时被调用(Activity会被传入.).
@Override
public void onAttach(Context context) {
super.onAttach(context);
mainActivity = (MainActivity) context;
}
public static MyMusicListFragment newInstance() {
MyMusicListFragment my = new MyMusicListFragment();
return my;
}
//onCreateView(),创建和fragment关联的view hierarchy时调用.
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_music_list_layout,null);
listView_my_music = (ListView) view.findViewById(R.id.listView_my_music);
//
listView_my_music.setOnItemClickListener(this);
//
loadData();
//绑定服务
//服务在加载SplashActivity(欢迎页面)的时候,已经启动
mainActivity.bindPlayService();
return view;
}
//onDestroyView(),当和fragment关联的view hierarchy正在被移除时调用.
@Override
public void onDestroyView() {
super.onDestroyView();
//解绑服务
//在Activity销毁时,解绑
mainActivity.unbindPlayService();
}
/**
* 加载本地音乐列表
*/
private void loadData(){
mp3Infos = MediaUtils.getMp3Infos(mainActivity);
myMusicListAdapter = new MyMusicListAdapter(mainActivity,mp3Infos);
listView_my_music.setAdapter(myMusicListAdapter);
}
// public ListView getListView_my_music() {
// return listView_my_music;
// }
//
// public ArrayList getMp3Infos() {
// return mp3Infos;
// }
//
// public MyMusicListAdapter getMyMusicListAdapter() {
// return myMusicListAdapter;
// }
//
// public MainActivity getMainActivity() {
// return mainActivity;
// }
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
mainActivity.playService.play(position);
}
}