基础
什么是Android中的Serice?
Service是一个长期运行在后台不提供用户界面的组件。
Service听起来像是一个线程,它们有什么区别?
- 线程独立主线程(UI线程)之外,而Service可以运行在主线程(默认情况下)中,也可以不在其中。
- 线程一旦被启动,只有满足相应的条件才能停止,而Service开启,可以通过stopService()或者unbindService()来停止。
Service如何启动呢?
- started : 在组件(例如activity)中调用startService(),一旦启动将会长时间运行在后台,通常started的服务用于执行单个操作并且不需要返回结果给开启者。例如下载,当完成下载,应该调用stopSelf()方法"自杀"。
- bound : 在组件中调用bindService()方法,bound的服务允许组件发送请求,获取结果,甚至可以进行进程间通信(IPC),当service没有被绑定时,service对象将会被销毁。
Notice: service默认运行在主进程的主线程中,这就意味着如果service要处理耗时操作或者阻塞操作(例如Map3播放,联网,蓝牙连接),应该在服务中开启工作线程来做这些工作,通过这种方式可以减少应用无响应(Application Not Responding ANR)的发生。
Started Service
如何定义Started Service呢?
继承Service或者IntentService
在manifest文件中配置Service
<manifest ... >
...
<application ... >
<service android:name="...." />
...
</application>
</manifest>
Service和IntentService怎么选择使用哪一个呢?
- 对于单个操作可以使用IntentService,IntentService开启一个工作线程,
当onHandlentent()函数执行完毕,service就会自杀,部分源码是这样的
private final class ServiceHandler extends Handler {
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj); //处理完操作就会自杀,
stopSelf(msg.arg1);
}
}
- 较复杂逻辑的要继承Service来完成了。
- IntentService使用比较简单只需实现onHandlentent()方法。
继承Service应该覆写哪些方法呢?
所以要覆写三个方法。
public class HelloService extends Service {
@Override
public void onCreate() {
/*在创建Service时执行,如果开启的服务已经再运行,不会调用这个方法*/
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
/**
*1. 在组件(例如Activity)调用了startService()就会执行此方法,一旦此方法
* 执行,service就会运行在后台,如果你想停止服务需要在组件中
* 调用stopService(),或者在service中调用stopSelf()
*2. 对于返回值必须是下面常量的其中一个:
* START_NOT_STICKY : 当系统杀死该服务,将不会重建这个service的对象。
* START_NOT_STICKY : 当系统杀死该服务,将会重新创建service,并且调
* 用onStartCommand()方法,但不会重新提交最后
* 一次intent,也就是系统调用onStartCommand()
* 但传入intent为null
* START_REDELIVER_INTENT: 系统杀死service后,重新创建service并且
* 调用onStartCommand()并把最后的请求的
* intent传入
*/
return START_STICKY;
}
/*********************用于绑定服务这里可以返回null****************/
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
/*
*当服务不再被使用时会调用此方法,在此方法中,应该放弃资源比如线程的
*注册的监听,等等。
*/
}
}
在组件中如何启动started service呢?
使用startService(Intent),并且intent定义方法与开启activity的intent一样有两种方式显式(类名)与隐式(action)。
如何停止started service?
- stopService(): 组件来停止服务,一般用于防止耗电,避免浪费系统资源 时使用。
- stopSelf(): 一般用于在onStartCommand()执行一个请求,当执行完相应操作就使用stopSelf()自杀。
- stopSelf(int): 当在onStartCommand()中执行多个请求时,建议使用此方法,因为这样可以避免当新的请求到来后,关闭了service的情况。