Service使用分为启动式和绑定式。
先来看启动式:
启动式最大特点是服务与活动没有绑定,即使关闭程序,服务也照样运行。
以music的方式说明:
// 使用启动式使用服务
public class MusicService extends Service {
MediaPlayer mMediaPlayer;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// 事先将音乐文件放在raw目录下
mMediaPlayer = MediaPlayer.create(MusicService.this, R.raw.music);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
int number = intent.getIntExtra("number", 1);
switch (number) {
case 1:
play();
break;
case 2:
pause();
break;
default:
break;
}
}
/**
* 播放音乐
*/
private void play() {
if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
mMediaPlayer.start();
}
}
/**
* 暂停音乐
*/
private void pause() {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
}
}
主布局就是四个按钮,就不贴了
public class MainActivity extends Activity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv_content);
}
public void onClick(View v) {
Intent mIntent = new Intent(MainActivity.this, MusicService.class);
switch (v.getId()) {
case R.id.btn_start:
mIntent.putExtra("music", 1);
startService(mIntent);
mTextView.setText("您已开启服务");
break;
case R.id.btn_pause:
mIntent.putExtra("music", 2);
startService(mIntent);
mTextView.setText("您已暂停音乐");
break;
case R.id.btn_stop:
MainActivity.this.finish();
Toast.makeText(MainActivity.this, "您已关闭程序", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_exit:
stopService(mIntent);
mTextView.setText("您已退出服务");
break;
default:
break;
}
}
}
代码应该没什么难的。下面是效果图:
当开始服务后,音乐播放,但当关闭程序后,音乐依然在播放,只有退出服务时才停止音乐。
下面再来看绑定时的情况:
绑定式使用服务时,当程序退出后,服务也会停止,即音乐停止播放。
/**
* 使用绑定式使用服务
* @author Administrator
*
*/
public class MusicService extends Service {
MediaPlayer mMediaPlayer;
MyBinder mBinder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/**
* 自定义了一个子类继承自Binder,并定义getService()方法用于获取Service对象
* @author Administrator
*
*/
class MyBinder extends Binder{
MusicService getMusicService(){
return MusicService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
// 事先将音乐文件放在raw目录下
mMediaPlayer = MediaPlayer.create(MusicService.this, R.raw.music);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
/**
* 播放音乐
*/
public void play() {
if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
mMediaPlayer.start();
}
}
/**
* 暂停音乐
*/
public void pause() {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
}
}
public class MainActivity extends Activity {
private TextView mTextView;
MusicService mService;
MyServiceConnection mServiceConnection = new MyServiceConnection();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv_content);
}
public void onClick(View v) {
Intent mIntent = new Intent(MainActivity.this, MusicService.class);
switch (v.getId()) {
case R.id.btn_bind:
bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
mTextView.setText("您已绑定服务");
break;
case R.id.btn_pause:
if (mService != null) {
mService.pause();
}
mTextView.setText("您已暂停音乐");
break;
case R.id.btn_stop:
MainActivity.this.finish();
Toast.makeText(MainActivity.this, "您已关闭程序", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_unbind:
unbindService(mServiceConnection);
mTextView.setText("您已取消绑定");
break;
default:
break;
}
}
/**
* 使用绑定式启动服务时,必须创建ServiceConnection类的对象,才能进行绑定
*
* @author Administrator
*
*/
class MyServiceConnection implements ServiceConnection {
// 返回一个IBinder接口对象,该对象即为onBind()方法返回的对象,
// 通过该对象获取Service对象,进而调用Service对象中的其他方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = ((MusicService.MyBinder) service).getMusicService();
if (mService != null) {
mService.play();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
}
}