什么是Service?
Service是 Android 系统中的一种组件,它和Activity的级别差不多,但又Activity不同,它是不能与用户交互的,但可以和其他组件进行交互。它不能自己运行,只能后台运行。
Service的特点:没有可视的UI、后台运行,运行不阻塞前台UI、拥有服务的进程具有较高的优先级
Service的生命周期:
Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。
服务启动的两种方式及用法:context.startService()和context.bindService()方式启动
提醒:使用Service之前必须在androidMainfest.xml 中注册
① context.startService()
启动:context.startService() ---> onCreate() ---> onStartCommand()
销毁:ontext.stopService() ---> onDestroy();
如果Service还没运行,则Android会先调用onCreate()方法,然后再调用onStartCommand();
如果Service已经运行了,则只调用onStartCommand(),所以一个Service的onStartCommand(),方法 可能会调用多
实例代码:通过打印结果可知其执行顺序
com.liu.activity包:
public class ServiceTestActivity extends Activity {
private Button btn_start, btn_end;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.service_test);
btn_start = (Button) findViewById(R.id.btn_satrt);
btn_end = (Button) findViewById(R.id.btn_end);
btn_start.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("--->启动服务");
// 通过 Intent 启动已注册的 service
startService(new Intent("com.sharpandroid.Music"));
}
});
btn_end.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("--->停止服务");
stopService(new Intent("com.sharpandroid.Music"));
}
});
}
}
com.liu.service包:
public class Service_MusicPlayer extends Service {
private final String TAG = "Service_MusicPlayer";
MediaPlayer mPlayer;
public void onCreate() {
Log.i(TAG, "--------->OnCreate()");
super.onCreate();
}
public void onStart(Intent intent, int startId) {
Log.i(TAG, "--------->OnStart()");
// 在layout下创建raw文件夹,放一个音乐文件(自命名如music)在raw下
mPlayer = MediaPlayer.create(this, R.raw.music);
super.onStart(intent, startId);
mPlayer.start();
}
public void onDestroy() {
Log.i(TAG, "--------->onDestroy()");
super.onDestroy();
mPlayer.stop();
}
public IBinder onBind(Intent intent) {
return null;
}
}
结果:

② context.bindService()
启动:context.bindService() ---> onCreate() --->onBind();
销毁:onUnibind() ---> onDestroy()
onBind()方法将返回给客户端一个IBind接口实例,IBind允许客户端调用服务的方法,比如得到Service 允许状态或者其他操作这个时 ? 候调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Service就会调用onUnibind() ---> onDesytoy()相应退出
实例代码:
com.liu.activity包:
public class TestActivity extends Activity {
private Button btn_satrt, btn_end;
private Bind_Service Bind_Service = null;
protected boolean isBound = false;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_satrt = (Button) findViewById(R.id.btn_start);
btn_end = (Button) findViewById(R.id.btn_end);
btn_satrt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("Bind服务");
Intent intent = new Intent(TestActivity.this,
Bind_Service.class);
// bindService(service, conn, flags)用来绑定一个服务
TestActivity.this.bindService(intent, mConnection,
Context.BIND_AUTO_CREATE);
isBound = true;
}
});
btn_end.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (isBound) {
System.out.println("unBind服务");
// unbindService(conn)解除绑定
TestActivity.this.unbindService(mConnection);
}
}
});
}
//ServiceConnection是bindService()的关键步骤,将Activity与Service捆绑在一起
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
Bind_Service = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
Bind_Service = ((Bind_Service.LocalBinder) service).getService();
}
};
}
com.liu.service包:
public class Bind_Service extends Service {
//内部类,作用返回Bind_Service对象
public class LocalBinder extends Binder {
public Bind_Service getService() {
return Bind_Service.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
System.out.println("------->onBind()");
return null;
}
@Override
public void onCreate() {
System.out.println("------->onCreate()");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("------->onDestroy()");
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
System.out.println("------->onStart()");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("------->onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
}
结果:
总结:startService()启动方式代码少、简单,适用于简单的应用,而bindService()操作性强,使用起来想Activity。
两者区别:bindService()方式启动的Service随Activity的生命结束而结束,startService()则不 受影响。