Service系列一共2篇,主要介绍Service相关的使用,以及使用Service实现IPC通讯。本文的重点是介绍Service相关的使用,经过Service 实现IPC通讯放在下一篇讲解。java
根据官方的介绍:app
Service存在的目的有2个:异步
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return startCommandReturnId;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
复制代码
要解释这个首先要知道Service的实现,须要实现抽象方法onBind,以及重写onStartCommand,这2个方法会在下文介绍到。ide
经过上面的介绍能够知道,Service有3种启动方式:oop
这几种方式启动的Service生命周期略微不一样。post
startService()只要一个Intent参数,指定要开启的Service便可this
Intent intent = new Intent(MainActivity.this, MyService.class);
复制代码
当调用Service的startService()后,spa
当调用stopSelf()或者stopService()后,会执行onDestroy(),表明Service生命周期结束。线程
startService方式启动Service不会调用到onBind()。 startService能够屡次调用,每次调用都会执行onStartCommand()。 无论调用多少次startService,只须要调用一次stopService就结束。 若是startService后没有调用stopSelf或者stopService,则Service一直存活并运行在后台。code
onStartCommand的返回值一共有3种
默认返回START_STICKY;
经过bindService绑定Service相对startService方式要复杂一点。 因为bindService是异步执行的,因此须要额外构建一个ServiceConnection对象用与接收bindService的状态,同时还要指定bindService的类型。
//1. 定义用于通讯的对象,在Service的onBind()中返回的对象。
public class MyBind extends Binder {
public int mProcessId;
}
//2. 定义用于接收状体的ServiceConnection
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//和服务绑定成功后,服务会回调该方法
//服务异常中断后重启,也会从新调用改方法
MyService.MyBind myBinder = (MyService.MyBind) service;
}
@Override
public void onNullBinding(ComponentName name) {
//Service的onBind()返回null时将会调用这个方法,并不会调用onServiceConnected()
}
@Override
public void onServiceDisconnected(ComponentName name) {
// 当服务异常终止时会调用。
// 注意,unbindService时不会调用
}
};
//3. 在须要的地方绑定到Service
bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
复制代码
bindService()也能够调用屡次,与startService()不一样,当发起对象与Service已经成功绑定后,不会屡次返回ServiceConnection中的回调方法。
经过bindService方式与Service进行绑定后,当没有对象与Service绑定后,Service生命周期结束,这个过程包括绑定对象被销毁,或者主动掉调用unbindService()
当同时调用startService和bindService后,须要分别调用stopService和unbindService,Service才会走onDestroy()
一个Service必需要在既没有和任何Activity关联又处理中止状态的时候才会被销毁。
经过上面的介绍咱们知道,经过StartService形式开启Service时,若是不主动调用stopService,Service将在后台一直运行。同时若是咱们在Service中执行耗时操做仍是引发ANR异常,为了解决这2个问题,IntentService出现了。 当咱们须要执行某些一次性、异步的操做时,IntentService能很好的知足这个场景。
IntentService相比于普通的Service,在使用时将再也不须要实现onStartCommand(),同时须要实现onHandleIntent()。 真正须要咱们处理的逻辑就在onHandleIntent()实现,IntentService会内部自动调用stopSelf()关闭本身。
至于防止ANR异常,具体的实现方式其实仍是挺简单,就是在内部新建了子线程,并在子线程中内部的Looper来分发事件,具体代码就不贴了。