Android开发---Service简析
简介
Service是android 四大组件之一,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。
Service的启动有两种方式:context.startService()和context.bindService()。
1.使用context.startService()启动Service
生命周期:
context.startService() ->onCreate()- >onStart()->Servicerunning->context.stopService()
onDestroy() ->Service stop
如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。
所以调用startService的生命周期为:onCreate --> onStart(可多次调用) --> onDestroy
2.使用context.bindService()启动Service
context.bindService()->onCreate()->onBind()->Service running
onUnbind() ->onDestroy() ->Servicestop
onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind -->onDestory。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等。
下面是一个实际的例子:
这个例子有四个类:
其中和Service有关的是PlayMusicActivit.java和MusicService.java
PlayMusicActivit是一个启动界面上面有四个按钮分别来启动、暂停、停止和关闭Service
MusicService是一个实际的Service类
另外连个类是用来做通知的,将在通知里面讲解
package com.my;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class PlayMusicActivity extends Activity {
private static final int NOTIFICATION_ID = 10001;
private Button playBtn;
private Button stopBtn;
private Button pauseBtn;
private Button closeBtn;
private Button exitBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
playBtn = (Button) findViewById(R.id.play_btn);
stopBtn = (Button) findViewById(R.id.stop_btn);
pauseBtn = (Button) findViewById(R.id.pause_btn);
closeBtn = (Button) findViewById(R.id.close_btn);
exitBtn = (Button) findViewById(R.id.exit_btn);
playBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent service = new Intent("com.my.musicService");
Bundle value = new Bundle();
value.putInt("opt", 1);
service.putExtras(value);
startService(service);
}
});
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent service = new Intent("com.my.musicService");
Bundle value = new Bundle();
value.putInt("opt", 2);
service.putExtras(value);
startService(service);
}
});
pauseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent service = new Intent("com.my.musicService");
Bundle value = new Bundle();
value.putInt("opt", 3);
service.putExtras(value);
startService(service);
}
});
closeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PlayMusicActivity.this.finish();
}
});
exitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent service = new Intent("com.my.musicService");
stopService(service);
final NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nm.cancel(NOTIFICATION_ID);
PlayMusicActivity.this.finish();
}
});
}
}
package com.my;
import java.io.IOException;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class MusicService extends Service {
private static final String TAG = "MusicService";
private MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.i(TAG, "create service");
super.onCreate();
if(mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(this, R.raw.he);
mediaPlayer.setLooping(false);
}
}
@Override
public void onDestroy() {
Log.i(TAG, "destroy service");
super.onDestroy();
if(mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
@Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "start service");
super.onStart(intent, startId);
if(intent != null) {
Bundle bundle = intent.getExtras();
if(bundle != null) {
int opt = bundle.getInt("opt");
switch(opt) {
case 1:
play();break;
case 2:
stop();break;
case 3:
pause();break;
}
}
}
}
private void play() {
if(!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}
private void pause() {
if(mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
private void stop() {
if(mediaPlayer != null) {
mediaPlayer.stop();
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}