學習android階段寫的一個例子,先將代碼和解析貼出來,如有不對,歡迎指示!
最終界面很簡單:

主要結構:
activity 和service通過互相通話來保持播放和界面狀態:

代碼主要代碼:MyPlayer.java(界面) ,MusicPlayService(service) ,IntentParam(參數)
MyPlayer.java:
package com.myplayer;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MyPlayer extends Activity implements OnClickListener
MusicPlayService:
package com.myplayer;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.IBinder;

public class MusicPlayService extends Service {
int status;
MediaPlayer mp;
OnCompletionListener completionListener;
CommandReceiver commandReceiver;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
mp = new MediaPlayer();
//初始化播放狀態為停止
status = IntentParam.STATUS_STOPPED;
//注冊來自activity傳來的命令接收器
commandReceiver = new CommandReceiver();
//添加過濾
IntentFilter filter1 = new IntentFilter();
filter1.addAction(IntentParam.TO_SERVICE);
filter1.addDataScheme("http");
IntentFilter filter2 = new IntentFilter();
filter2.addAction(IntentParam.TO_SERVICE);
//注冊接收器
registerReceiver(commandReceiver, filter1);
registerReceiver(commandReceiver, filter2);
//初始化音樂播放完畢的處理事情,通知界面跟新
completionListener = new OnCompletionListener(){
public void onCompletion(MediaPlayer mplayer) {
mplayer.stop();
status = IntentParam.STATUS_STOPPED;
updateUi();
}
};
}


//根據初始化狀態 初始化界面 這里可以根據status來控制
@Override
public void onStart(Intent intent, int startId) {
updateUi();
}
@Override
public void onDestroy() {
//釋放資源
unregisterReceiver(commandReceiver);
mp.release();
}
//構建接收器
public class CommandReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getIntExtra("cmd", -1)) {
case IntentParam.CMD_PLAY://如果界面傳來命令是播放
Uri media = intent.getData();//獲取activity傳來的intent里面的數據
if (media != null) {//如果已經有音樂在播放 就釋放 才行構建
mp.release();
mp = MediaPlayer.create(context, media);
mp.setOnCompletionListener(completionListener);//添加播放完畢的處理事件
try {
mp.start();//開始播放
} catch (Exception e) {
e.printStackTrace();
}
} else {
mp.start();
}
status = IntentParam.STATUS_PLAYING;
break;
case IntentParam.CMD_PAUSE:
mp.pause();
status = IntentParam.STATUS_PAUSED;
break;
case IntentParam.CMD_STOP:
mp.stop();
status = IntentParam.STATUS_STOPPED;
break;
default:
break;
}
updateUi();//根據當前的狀態 通知界面跟新
}

}
//通知界面根性也就是將意圖發出去讓界面接收
private void updateUi() {
Intent intent = new Intent(IntentParam.TO_ACTIVITY);
intent.putExtra("status", status);
sendBroadcast(intent);
}
}
IntentParam:
package com.myplayer;

public class IntentParam {

public static final int CMD_PLAY = 0;
public static final int CMD_PAUSE = 1;
public static final int CMD_STOP = 2;
public static final int STATUS_PLAYING = 0;
public static final int STATUS_PAUSED = 1;
public static final int STATUS_STOPPED = 2;

public static final String TO_SERVICE = "toService";
public static final String TO_ACTIVITY = "toActivity";
}
另外就是AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myplayer"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyPlayer"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="MusicPlayService" android:process=":remote"></service>//添加service
</application>
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>//添加權限
</manifest>
完整代碼下載:(暈,不知道這里什么地方可以放代碼下載!!!)
放到google上不知道能不能下載:
http://infojj.googlegroups.com/web/myplayer.rar?hl=zh-CN&gda=OQGoLz8AAABJFYDHK64yE3Lf8rmWTTkKKuZHDK1BZ-D4nJlRz2lseLjh9f496UMDItX0DkmsAJ2ccyFKn-rNKC-d1pM_IdV0&gsc=ccLByiEAAAAyTazefkXbIBkLj9dbvmKyYyEKXZEdBEdpC0MvbzBM00zfKN-m9S9niuHrq-IEXAE
最終界面很簡單:

主要結構:
activity 和service通過互相通話來保持播放和界面狀態:

代碼主要代碼:MyPlayer.java(界面) ,MusicPlayService(service) ,IntentParam(參數)
MyPlayer.java:































































































































IntentParam:

































完整代碼下載:(暈,不知道這里什么地方可以放代碼下載!!!)
放到google上不知道能不能下載:
http://infojj.googlegroups.com/web/myplayer.rar?hl=zh-CN&gda=OQGoLz8AAABJFYDHK64yE3Lf8rmWTTkKKuZHDK1BZ-D4nJlRz2lseLjh9f496UMDItX0DkmsAJ2ccyFKn-rNKC-d1pM_IdV0&gsc=ccLByiEAAAAyTazefkXbIBkLj9dbvmKyYyEKXZEdBEdpC0MvbzBM00zfKN-m9S9niuHrq-IEXAE