Posted on 2009-11-04 13:48
瘋狂 閱讀(3188)
評論(2) 編輯 收藏 所屬分類:
android
學習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
{
Button playpausebn;
Button stopbn;
OnClickListener clickListener;
Uri nowPlay;
int status;
UpdateReceiver receiver;

@Override

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);// 添加界面

playpausebn = (Button) findViewById(R.id.palypause);// 獲取播放暫停按鈕
stopbn = (Button) findViewById(R.id.stop);// 獲取停止按鈕
// 解析歌曲路徑,service 通過uri創建MediaPlayer

nowPlay = Uri
.parse("http://julysky.wz66.com/uploadfiles/2007-3/321388085.mp3");//這里播放的是暗(*^__^*) 嘻嘻……

// 給按鈕添加監聽,用來控制播放
playpausebn.setOnClickListener(this);
stopbn.setOnClickListener(this);
// 添加廣播接收器 也就是用來接收sevice傳過來的數據 intent
receiver = new UpdateReceiver();
// 添加過濾器 只接收
IntentFilter filter = new IntentFilter();
filter.addAction(IntentParam.TO_ACTIVITY);
registerReceiver(receiver, filter);// 注冊接收器
// service自己不能啟動 是由當前activity上下文啟動 此時會調用service的oncreate方法初始化service
startService(new Intent(this, MusicPlayService.class));
}

// 實現onclickListener的方法

public void onClick(View v)
{

if (nowPlay == null)
{
return;
}
int cmd = 0;
Intent intent = new Intent(IntentParam.TO_SERVICE);// 創建意圖,通知service
// 根據cmd命令控制后臺音樂的播放

switch (v.getId())
{
case R.id.palypause:// 如果點擊了暫停和播放按鈕

if (status == IntentParam.STATUS_PLAYING)
{// 并且當前狀態時播放,就暫停
cmd = IntentParam.CMD_PAUSE;// 暫停命令
} else if (status == IntentParam.STATUS_STOPPED

|| status == IntentParam.STATUS_PAUSED)
{// 并且當前狀態時暫停或停止,就播放
intent.setData(nowPlay);// 給意圖添加數據,也就是將音樂uri傳給service
cmd = IntentParam.CMD_PLAY;// 播放命令

} else
{
cmd = IntentParam.CMD_STOP;
}
break;
case R.id.stop:
cmd = IntentParam.CMD_STOP;// 停止命令
default:
break;
}
intent.putExtra("cmd", cmd);// 將命令放入意圖
sendBroadcast(intent);// 播出意圖

}

// 廣播接收器接收service傳來的消息 根據service傳來的音樂播放狀態 來跟新界面

public class UpdateReceiver extends BroadcastReceiver
{
@Override

public void onReceive(Context context, Intent intent)
{
status = intent.getIntExtra("status", -1);// 獲取狀態

switch (status)
{
case IntentParam.STATUS_PLAYING:// 播放狀態
playpausebn.setText(R.string.pause);// 這里簡單的修改按鈕的文字,
break;
case IntentParam.STATUS_PAUSED:
case IntentParam.STATUS_STOPPED:
playpausebn.setText(R.string.play);
break;
default:
break;
}
}

}

}
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