Service基础
service 是Android的四大组件之一,服务的主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示UI的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这样也是服务的重要用途之一。
1、 Service生命周期
Service生命周期可以从两种启动Service的模式开始讲起,分别是context.startService()和context.bindService()。
(1).startService的启动模式下的生命周期:当我们首次使用startService启动一个服务时,系统会实例化一个Service实例,依次调用其onCreate和onStartCommand方法,然后进入运行状态,此后,如果再使用startService启动服务时,不再创建新的服务对象,系统会自动找到刚才创建的Service实例,调用其onStart方法;如果我们想要停掉一个服务,可使用stopService方法,此时onDestroy方法会被调用,需要注意的是,不管前面使用了多个次startService,只需一次stopService,即可停掉服务。
(2).bindService启动模式下的生命周期:在这种模式下,当调用者首次使用bindService绑定一个服务时,系统会实例化一个Service实例,并一次调用其onCreate方法和onBind方法,然后调用者就可以和服务进行交互了,此后,如果再次使用bindService绑定服务,系统不会创建新的Service实例,也不会再调用onBind方法;如果我们需要解除与这个服务的绑定,可使用unbindService方法,此时onUnbind方法和onDestroy方法会被调用。
两种模式有以下几点不同之处:startService模式下调用者与服务无必然联系,即使调用者结束了自己的生命周期,只要没有使用stopService方法停止这个服务,服务仍会运行;通常情况下,bindService模式下服务是与调用者生死与共的,在绑定结束之后,一旦调用者被销毁,服务也就立即终止,就像江湖上的一句话:不求同生,但愿同死。
值得一提的是,以前我们在使用startService启动服务时都是习惯重写onStart方法,在Android2.0时系统引进了onStartCommand方法取代onStart方法,为了兼容以前的程序,在onStartCommand方法中其实调用了onStart方法,不过我们最好是重写onStartCommand方法。
以上两种模式的流程如下图所示:
下面我们就结合实例来演示一下这两种模式的生命周期过程。我们新建一个名为service的项目,然后创建一个MyService的服务类,代码如下:
public class MyService extends Service {
private static final String TAG = "MyService";
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate called.");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand called.");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.i(TAG, "onStart called.");
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind called.");
return null;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG, "onUnbind called.");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy called.");
}
然后再AndroidManifest.xml中配置服务信息,不然这个服务就不会生效,配置如下:
<service android:name=".MyService">
<intent-filter>
<action android:name="android.intent.action.MyService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
一个是启动服务,另一个是停止服务,我们来看一下他们的点击事件:
/**
* 启动服务
* @param view
*/
public void start(View view) {
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
/**
* 停止服务
* @param view
*/
public void stop(View view) {
Intent intent = new Intent(this, MyService.class);
stopService(intent);
}
bind方式绑定和解除服务
/**
* 绑定服务
* @param view
*/
public void bind(View view) {
Intent intent = new Intent(this, MyService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
/**
* 解除绑定
* @param view
*/
public void unbind(View view) {
unbindService(conn);
}