ps:首先來寫這個部落客要也是因為在朋友的項目中要用這個技術,是以再好奇的心理下,我也對此來進行了小小的一個試驗純純的試驗【播放一短音樂的功能】。
因為我對這塊的理論知識也是一知半解,是以也就不在這賣弄了,有想補充的同鞋可以自行查閱官網API。
好了 不再多廢話了說下步驟吧!
- 第一步:建立作為服務端的應用
- 第二步:建立.aidl檔案(檔案支援格式同java基本資料類型一樣,檔案名同接口名要一樣不然會報錯),并寫接口方法。儲存自動在gen目錄下生成同名的.java檔案,因為我的服務端是在原有的DEMO中寫的是以看到其它的類 大家可以略過 aidl檔案中的内容很簡單就兩個方法 播放和停止,也沒有其它太多的内容
Android之小試AIDL Android之小試AIDL -
第三步:自定義類繼承Servicer重寫其中的onCreat(),onBind(),onStart()方法;實作音樂的播放停止方法
`public class playMusicService extends Service {
private MediaPlayer mp;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return bulider;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
mp = new MediaPlayer();
mp = MediaPlayer.create(playMusicService.this, R.raw.s001);
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
// 當播放發生錯誤時的處理事件 mp.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub // 釋放音樂資源 mp.release(); return false; } }); super.onStart(intent, startId);
}
public play.Stub bulider = new play.Stub() {
@Override public void stop() throws RemoteException { // TODO Auto-generated method stub System.out.println("停止播放"); stopMusic(); } @Override public void playing() throws RemoteException { // TODO Auto-generated method stub System.out.println("開始播放"); playMusic(); }
};
public void playMusic() {
// 開始播放音樂
mp.start();
// 音樂播放完畢的處理事件
mp.setOnCompletionListener(new OnCompletionListener() {
@Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub // 循環播放 mp.start(); }
});
if(mp.isPlaying()){
mp.reset();
mp.start();
}
}
-
第四步:建立用戶端應用 内容其實也很簡單,複制過來服務端的.aidl檔案【路徑名要一樣】,然後通過ServiceConnection接口接收service傳回的IBinder對象,`public class MainActivity extends Activity {
private play mPlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(“com.example.service.playMusicService.aidl”);
bindService(intent, connection, BIND_AUTO_CREATE);
}
public void playing(View v) {
try {
mPlay.playing();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void stopMusic() {
mp.stop();
mp.release();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
// 服務停止時停止播放音樂并釋放資源
mp.stop();
mp.release();
super.onDestroy();
}
}`
到這裡關于服務端的内容也就搞定了 ,當然别忘了在AndroidManifest.xml中注冊service
public void stop(View v) throws RemoteException {
mPlay.stop();
}
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mPlay = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mPlay = play.Stub.asInterface(service);
}
};
}`
至此這個小小的DEMO也就完成了 ,親測可用 不過音樂播放會有小小問題沒解決,不過大概流程也就是這樣的!