Posted on 2009-11-04 13:48
瘋狂 閱讀(3198)
評(píng)論(2) 編輯 收藏 所屬分類:
android
學(xué)習(xí)android階段寫的一個(gè)例子,先將代碼和解析貼出來(lái),如有不對(duì),歡迎指示!
最終界面很簡(jiǎn)單:

主要結(jié)構(gòu):
activity 和service通過(guò)互相通話來(lái)保持播放和界面狀態(tài):
代碼主要代碼:MyPlayer.java(界面) ,MusicPlayService(service) ,IntentParam(參數(shù))
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 通過(guò)uri創(chuàng)建MediaPlayer

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

// 給按鈕添加監(jiān)聽(tīng),用來(lái)控制播放
playpausebn.setOnClickListener(this);
stopbn.setOnClickListener(this);
// 添加廣播接收器 也就是用來(lái)接收sevice傳過(guò)來(lái)的數(shù)據(jù) intent
receiver = new UpdateReceiver();
// 添加過(guò)濾器 只接收
IntentFilter filter = new IntentFilter();
filter.addAction(IntentParam.TO_ACTIVITY);
registerReceiver(receiver, filter);// 注冊(cè)接收器
// service自己不能啟動(dòng) 是由當(dāng)前activity上下文啟動(dòng) 此時(shí)會(huì)調(diào)用service的oncreate方法初始化service
startService(new Intent(this, MusicPlayService.class));
}

// 實(shí)現(xiàn)onclickListener的方法

public void onClick(View v)
{

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

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

if (status == IntentParam.STATUS_PLAYING)
{// 并且當(dāng)前狀態(tài)時(shí)播放,就暫停
cmd = IntentParam.CMD_PAUSE;// 暫停命令
} else if (status == IntentParam.STATUS_STOPPED

|| status == IntentParam.STATUS_PAUSED)
{// 并且當(dāng)前狀態(tài)時(shí)暫停或停止,就播放
intent.setData(nowPlay);// 給意圖添加數(shù)據(jù),也就是將音樂(lè)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傳來(lái)的消息 根據(jù)service傳來(lái)的音樂(lè)播放狀態(tài) 來(lái)跟新界面

public class UpdateReceiver extends BroadcastReceiver
{
@Override

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

switch (status)
{
case IntentParam.STATUS_PLAYING:// 播放狀態(tài)
playpausebn.setText(R.string.pause);// 這里簡(jiǎn)單的修改按鈕的文字,
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();
//初始化播放狀態(tài)為停止
status = IntentParam.STATUS_STOPPED;
//注冊(cè)來(lái)自activity傳來(lái)的命令接收器
commandReceiver = new CommandReceiver();
//添加過(guò)濾
IntentFilter filter1 = new IntentFilter();
filter1.addAction(IntentParam.TO_SERVICE);
filter1.addDataScheme("http");
IntentFilter filter2 = new IntentFilter();
filter2.addAction(IntentParam.TO_SERVICE);
//注冊(cè)接收器
registerReceiver(commandReceiver, filter1);
registerReceiver(commandReceiver, filter2);
//初始化音樂(lè)播放完畢的處理事情,通知界面跟新

completionListener = new OnCompletionListener()
{

public void onCompletion(MediaPlayer mplayer)
{
mplayer.stop();
status = IntentParam.STATUS_STOPPED;
updateUi();
}
};
}


//根據(jù)初始化狀態(tài) 初始化界面 這里可以根據(jù)status來(lái)控制
@Override

public void onStart(Intent intent, int startId)
{
updateUi();
}
@Override

public void onDestroy()
{
//釋放資源
unregisterReceiver(commandReceiver);
mp.release();
}
//構(gòu)建接收器

public class CommandReceiver extends BroadcastReceiver
{

@Override

public void onReceive(Context context, Intent intent)
{

switch (intent.getIntExtra("cmd", -1))
{
case IntentParam.CMD_PLAY://如果界面?zhèn)鱽?lái)命令是播放
Uri media = intent.getData();//獲取activity傳來(lái)的intent里面的數(shù)據(jù)

if (media != null)
{//如果已經(jīng)有音樂(lè)在播放 就釋放 才行構(gòu)建
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();//根據(jù)當(dāng)前的狀態(tài) 通知界面跟新
}

}
//通知界面根性也就是將意圖發(fā)出去讓界面接收

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>//添加權(quán)限
</manifest>
完整代碼下載:(暈,不知道這里什么地方可以放代碼下載!!!)
放到google上不知道能不能下載:
http://infojj.googlegroups.com/web/myplayer.rar?hl=zh-CN&gda=OQGoLz8AAABJFYDHK64yE3Lf8rmWTTkKKuZHDK1BZ-D4nJlRz2lseLjh9f496UMDItX0DkmsAJ2ccyFKn-rNKC-d1pM_IdV0&gsc=ccLByiEAAAAyTazefkXbIBkLj9dbvmKyYyEKXZEdBEdpC0MvbzBM00zfKN-m9S9niuHrq-IEXAE