第二種是通過綁定Activity的方式來啓動Service。先看流程圖。
綁定的方式和第一節的方式最大的不同就是在於,Activity可以和Service實現關聯,當被關聯的Activity結束後,相應的Service也會停止,同時在綁定了的Activity中我們還可以回調我們在Service中定義的方法。在這裏我們使用了this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE); 來啓動Service,當Service創建了同時綁定了Activity之後,會回調我們定義的ServiceConnection(),從而傳回IBinder接口,我們就能夠調用Service中的方法了。這時候Activity就和Service實現了綁定,Activity退出了Service就相應的退出了。Service的申明如下,intent filter 是對接收Service的過濾。
<service android:enabled="true" android:name=".service.mediaplayer.BindMusicService">
<intent-filter>
<action android:name="com.androidtest.service.mediaplayer.BindMusicService" />
</intent-filter>
</service>
|
Acitivity
/**
* BinderMusicPlayerActivity.java
* com.androidtest.activity.musicplayer
*
* Function: TODO
*
* ver date author
* ──────────────────────────────────
* 2011-5-17 Leon
*
* Copyright (c) 2011, 最牛網 All Rights Reserved.
*/
package com.zuiniuwang.playeractivity;
import android.app.Activity;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.zuiniuwang.MyMediaController;
import com.zuiniuwang.R;
import com.zuiniuwang.service.BindMusicService;
import com.zuiniuwang.service.MyBinder;
/**
* ClassName:BinderMusicPlayerActivity Function: TODO ADD FUNCTION Reason: TODO
* ADD REASON
*
* @author Leon
* @version
* @since Ver 1.1
* @Date 2011-5-17
*/
public class BinderMusicPlayerActivity extends Activity implements
OnClickListener {
private static final String TAG = BinderMusicPlayerActivity.class
.getSimpleName();
private BindMusicService bindMusicService;
private Button playButton, pauseButton, stopButton, closeActivityButton,
exitActivityButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.v(TAG , TAG+"onCreate()");
this.setContentView(R.layout.music_player_layout);
findViews();
bindViews();
connection();
}
private void findViews() {
playButton = (Button) this.findViewById(R.id.play);
pauseButton = (Button) this.findViewById(R.id.pause);
stopButton = (Button) this.findViewById(R.id.stop);
closeActivityButton = (Button) this.findViewById(R.id.close);
exitActivityButton = (Button) this.findViewById(R.id.exit);
}
private void bindViews() {
playButton.setOnClickListener(this);
pauseButton.setOnClickListener(this);
stopButton.setOnClickListener(this);
closeActivityButton.setOnClickListener(this);
exitActivityButton.setOnClickListener(this);
}
private void connection() {
Log.v(TAG , TAG+"connection");
Intent intent = new Intent("com.androidtest.service.mediaplayer.BindMusicService");
this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE);
}
public void onClick(View view) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
switch (view.getId()) {
case R.id.play:
Log.d(TAG, "play.......");
MyMediaController.play.execute();
break;
case R.id.pause:
Log.d(TAG, "pause.......");
MyMediaController.pause.execute();
break;
case R.id.stop:
Log.d(TAG, "stop.......");
MyMediaController.stop.execute();
break;
case R.id.close:
Log.d(TAG, "close.......");
this.finish();
break;
case R.id.exit:
Log.d(TAG, "exit.......");
this.finish();
this.stopService(new Intent("com.androidtest.service.mediaplayer.BindMusicService"));
}
}
//調用bindService後 Service調用onBind()後 回調此函數
private ServiceConnection myServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder binder) {
Log.v(TAG , TAG+ "onServiceConnected");
// TODO Auto-generated method stub
bindMusicService = ((MyBinder)binder).getService();
//給Controller設置Service初始化的MediaPlayer
MyMediaController.mediaPlayer=bindMusicService.getMyMediaPlayer();
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
bindMusicService=null;
Log.v(TAG, "..............onServiceDisconnected");
}
};
//當Activity finish時必須解綁 不然會出現溢出
public void finish() {
// TODO Auto-generated method stub
super.finish();
this.unbindService(myServiceConnection);
}
}
Service:
/**
* BindMusicService.java
* com.androidtest.service.mediaplayer
*
* Function: TODO
*
* ver date author
* ──────────────────────────────────
* 2011-5-16 Leon
*
* Copyright (c) 2011, 最牛網 All Rights Reserved.
*/
package com.zuiniuwang.service;
import com.zuiniuwang.R;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
/**
* ClassName:BindMusicService
* Function: TODO ADD FUNCTION
* Reason: TODO ADD REASON
*
* @author Leon
* @version
* @since Ver 1.1
* @Date 2011-5-16
*/
public class BindMusicService extends Service {
private static final String TAG = BindMusicService.class.getSimpleName();
private MediaPlayer myMediaPlayer ;
private IBinder binder = new MyBinder(this);
public MediaPlayer getMyMediaPlayer() {
return myMediaPlayer;
}
public void setMyMediaPlayer(MediaPlayer myMediaPlayer) {
this.myMediaPlayer = myMediaPlayer;
}
@Override
public IBinder onBind(Intent intent) {
Log.v(TAG, TAG+" onBind");
// TODO Auto-generated method stub
return binder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
if(myMediaPlayer==null){
myMediaPlayer=MediaPlayer.create(this, R.raw.test) ;
myMediaPlayer.setLooping(false);
}
Log.v(TAG , TAG +" onCreate()");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.v(TAG, TAG+"onDestroy()");
if(myMediaPlayer!=null){
myMediaPlayer.stop();
myMediaPlayer.release();
}
}
//通過bindService的方式,onStart函數不會調用
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Log.v(TAG, TAG+" onStart()");
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.v(TAG , TAG +" onUnbind ,成功沒有?" );
return false;
}
@Override
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
Log.v(TAG , TAG +" onRebind()----------------------------------->");
super.onRebind(intent);
}
}
綁定時用到的Binder類
/**
* MyBinder.java
* com.androidtest.service.mediaplayer
*
* Function: TODO
*
* ver date author
* ──────────────────────────────────
* 2011-5-17 Leon
*
* Copyright (c) 2011, TNT All Rights Reserved.
*/
package com.zuiniuwang.service;
import android.os.Binder;
/**
* ClassName:MyBinder Function: TODO ADD FUNCTION Reason: TODO ADD REASON
*
* @author Leon
* @version
* @since Ver 1.1
* @Date 2011-5-17
*/
public class MyBinder extends Binder {
private BindMusicService bindMusicService;
public MyBinder(BindMusicService bindMusicService) {
this.bindMusicService = bindMusicService;
};
public BindMusicService getService() {
return bindMusicService;
}
}
本節的源代碼可以在此下載:http://download.csdn.net/detail/internetman/3967654 自己沒有分了所以設置了需要分數才能下載,呵呵