Android学习笔记(七) 音乐播放器 Service实现

关于Service

推荐

http://blog.csdn.net/Android_Tutor/archive/2010/08/04/5789203.aspx 

 

 

关于binder机制

推荐

http://blog.csdn.net/maxleng/archive/2010/04/15/5490770.aspx

 

 

 

//下面是MusicPlayer用Service实现

 

//MyService.java

package young.MyService; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.ContextMenu; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.AdapterView.OnItemClickListener; public class MyService extends Activity implements OnClickListener,OnItemClickListener { private MusicService musicService; private Context myContext; private Button btnSynchro , btnStop , btnRestart , btnPause; private ListView songsListView; private ArrayList<Map<String, Object>> songs ; //在bindService时会启动他 private ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub musicService = ((MusicService.MyBinder)service).getService(); } public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //启动服务 Intent i = new Intent(); i.setClass(MyService.this, MusicService.class); //bindService启动的Service在Activity关闭时不会关闭,start会关闭 bindService(i, mServiceConnection, BIND_AUTO_CREATE); initView(); } private void initView(){ songsListView = (ListView)findViewById(R.id.music_list); songsListView.setOnItemClickListener(this); btnSynchro = (Button)findViewById(R.id.synchro); btnSynchro.setOnClickListener(this); btnPause = (Button)findViewById(R.id.pause); btnPause.setOnClickListener(this); btnStop = (Button)findViewById(R.id.stop); btnStop.setOnClickListener(this); btnRestart = (Button)findViewById(R.id.restart); btnRestart.setOnClickListener(this); } public void onClick(View v) { // TODO Auto-generated method stub if (v==btnSynchro) { try { songs = musicService.synchro(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } SimpleAdapter ladapter = new SimpleAdapter( this, songs, R.layout.relative, new String[]{"FileName","Path"}, new int[]{R.id.Name,R.id.Path} ); songsListView.setAdapter(ladapter); } if(v==btnPause) musicService.pauseMusic(); if(v==btnRestart)musicService.restartMusic(); if(v==btnStop)musicService.stopMusic(); } public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub HashMap<String, Object> o = (HashMap<String, Object>) arg0 .getItemAtPosition(position); try { musicService.playMusic(o.get("Path").toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

 

//MusicService

 

package young.MyService; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Binder; import android.os.IBinder; public class MusicService extends Service{ private MyBinder binder ; private MediaPlayer musicPlayer; private static ArrayList<File> musicLibrary =null; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub binder = new MyBinder(); return binder; } @Override public void onCreate() { super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } @Override public void onDestroy() { super.onDestroy(); } //恢复播放 public void restartMusic(){ if(musicPlayer == null)return ; if(!musicPlayer.isPlaying()){ musicPlayer.start(); } } // //暂停播放 public void pauseMusic(){ if(musicPlayer == null)return ; if(musicPlayer.isPlaying()) musicPlayer.pause(); } //停止播放 public void stopMusic(){ if(musicPlayer == null)return ; if(musicPlayer.isPlaying()) musicPlayer.stop(); } //播放一首音乐 public void playMusic(String path) throws IOException{ if(musicPlayer == null)musicPlayer = new MediaPlayer(); if(musicPlayer.isPlaying())musicPlayer.stop(); try{ musicPlayer.reset(); musicPlayer.setDataSource(path); musicPlayer.prepare(); musicPlayer.start(); }catch (IllegalArgumentException e) { // handle exception e.printStackTrace(); } catch (IllegalStateException e) { // handle exception e.printStackTrace(); } musicPlayer.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub mp.release(); } }); } /** * * @return * @throws IOException */ public ArrayList<Map<String, Object>> synchro() throws IOException{ musicLibrary = new ArrayList<File>(); getAllFiles(new File("/sdcard")); return getMapData(musicLibrary); } /** * * @param root * @throws IOException */ private void getAllFiles(File root) throws IOException{ File files[] = root.listFiles(); if(files != null) for(File f:files){ if(f.isDirectory()){ getAllFiles(f); } else{ //检查文件类型 String fpath = f.getPath().substring(f.getPath().lastIndexOf(".")+1,f.getPath().length()); if(fpath.equals("mp3")){ musicLibrary.add(f); } } } } /** * 这个函数返回<Map<String, Object>>类型的musicLibrary 用于作为listView数据源 * @param list * @return */ private ArrayList<Map<String, Object>> getMapData(ArrayList<File> list){ ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); HashMap<String,Object> item; int i = 0 ; for(i=0;i<list.size();i++){ item = new HashMap<String,Object>(); String path = list.get(i).toString(); String name = path.substring(path.lastIndexOf("/")+1,path.length()); //保存每一格list单元格的数据 , item.put("FileName",name); item.put("Path", path); data.add(item); } return data; } public class MyBinder extends Binder{ MusicService getService() { return MusicService.this; } } }  

 

记得在Mainfest中注册Service

你可能感兴趣的:(android,ListView,object,service,音乐,button)