Service 是 Android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),与Activity的不同是Service只能运行在后台,Service没有界面并且生命周期也与Activity不同。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。此外,一个组件可以绑定到一个服务与之交互,甚至执行进程间通信(IPC)。 例如一个服务可以在后台处理网络交易、播放音乐、执行文件 I/O,或与内容提供者交互等。
1. Service启动方式
1)启动服务方式
- startService方式
onCreate()
:服务创建时调用
onStartCommand()
:服务被调用开启方法时调用
onDestroy()
:服务销毁时调用
当一个Service在被使用 startService方法启动,不管是否调用了 bindService(绑定服务)或 unbindService(解除绑定服务)到该Service,该Service都会在后台运行并不受影响。一个Service被使用 startService方法启动多少次,onCreate方法只会调用一次,onStartCommand方法将会被调用多次(与 startService的次数一致),且系统只会创建一个Service实例(结束该Service也只需要调用一次 stopService),该Service会一直在后台运行直至调用 stopService或调用自身的 stopSelf方法。
- bindService方式
onCreate()
:服务创建时调用
onBind()
:服务被绑定时调用
onServiceConnected()
:服务连接时调用
onUnbind()
:服务被解绑时调用
onDestroy()
:服务销毁时调用
当一个Service在被使用 bindService方法启动,不论 bindService被调用几次,Service的 onCreate方法只会执行一次,同时 onStartCommand方法始终不会调用。
- 混合方式
onCreate()
:服务创建时调用
onStartCommand()
:服务被调用开启方法时调用
onBind()
:服务被绑定时调用
onServiceConnected()
:服务连接时调用
onUnbind()
:服务被解绑时调用
onDestroy()
:服务销毁时调用
当一个Service在被启动(startService的同时又被绑定 bindService),该Service将会一直在后台运行,并且不管调用几次,onCreate方法始终只会调用一次,onStartCommand的调用次数与 startService调用的次数一致(使用 bindService方法不会调用 onStartCommand)。同时,调用 unBindService将不会停止Service,必须调用 stopService或 Service自身的 stopSelf来停止服务。
2)启动服务区别
startService:
(1) 调用者退出后,Service仍然存在;
(2) startService()
和stopService()
只能开启和关闭Service,无法操作Service
bindService:
(1) 调用者退出后,Service随着调用者销毁;
(2) bindService()
和unbindService()
可以操作Service
2. Service基本用法
- startService方式启动服务
1) 继承 Service
(1) 新建一个MyService继承自Service,并重写父类方法;
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;
...
...
(3) 通过startService()
启动,stopService()
停止服务。
Intent intent = new Intent(this, MyService.class);
//开启服务
startService(intent);
//停止服务
stopService(intent);
2)继承 IntentService
因为Service中几个方法的回调都是在主线程中,如果使用Service执行特别耗时的操作,建议单独新建线程去操作,避免阻塞主线程(UI线程)。IntentService在内部帮我们新建的线程,执行完毕任务后会自动关闭,无需手动结束它。
(1) 新建一个MyService继承自IntentService,并重写父类方法;
public class MyService extends IntentService {
public MyService() {
super("MyService");
}
@Override
protected void onHandleIntent(Intent intent) {
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;
...
...
(3) 通过startService()
启动服务
Intent intent = new Intent(this, MyService.class);
//开启服务
startService(intent);
- bindService方式启动服务
1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
}
2)通过bindService()
绑定服务,通过unbindService()
解绑服务。
MyService myService;
ServiceConnection mConnection = ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.MyBinder binder = (MyService.MyBinder) service;
mService = binder.getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myService = null;
}
};
Intent intent = new Intent(this, MyService.class);
// 绑定服务
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
// 解绑服务
unbindService(mConnection);
- 混合方式启动服务
1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
}
2)在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;
...
...
3)通过startService()
启动,stopService()
停止服务。
MyService myService;
ServiceConnection mConnection = ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.MyBinder binder = (MyService.MyBinder) service;
mService = binder.getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myService = null;
}
};
Intent intent = new Intent(this, MyService.class);
//开启并绑定服务
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
// 解绑服务
unbindService(mConnection);
//停止服务
stopService(intent);
3. Service生命周期
Android Service生命周期浅析
参考
Service官方文档,开启传送门