本篇文章主要讲一些Service的知识点。
一. Service分类
- 按运行地点分类
类型 | 特点 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|
本地服务[LocalService] | 运行在主线程 主线程终止后,服务也会终止 | 节约资源 通信方便 | 主进程终止后,服务也会终止 | 需依附某个进程的服务:音乐播放器 |
远程服务[RemoteService] | 运行在独立的进程 不受其他Activity的影响 | 服务常驻后台,不受其他Activity的影响 | 消耗资源,需要单独开辟进程;通信复杂AIDL进行复查IPC操作 | 系统级服务 |
- 按运行类型分
类型 | 特点 | 应用场景 |
---|---|---|
前台服务 [用户可见] | 在通知栏显示通知[用户可见的服务] | 服务使用时需要用户知道,如:音乐播放器 |
后台服务 | 处于后台的服务[用户不可见] | 服务使用时用户不需要知道。如日期更新等 |
- 按功能分类
类型 | 特点 | 应用场景 |
---|---|---|
不可同行的后台服务 | startService启动,调用者退出后,服务依然在后台运行 | Service不与Acitivity通信 |
可通信的后台服务 bindService 方式启动 | bindService 方式启动 ,调用者退出后,随着调用者一起销毁 | 服务需要与Activity进行通信。节约系统资源=第一次bindService才会去创建Service运行;服务只公开一个远程接口,供客户端调用;BroadCast也可完成这种需要,但是因为频繁调用的话,造成性能问题,并且BroadCast执行时间短,可能代码执行一段就不继续执行了,而Service就不会有这些问题 |
可通信的后台服务 使用startService 、bindService启动 | 调用者退出后,随着调用者销毁 | Service与Activity通信,不需要控制开始时刻 |
二. Service的一些属性
Androidmanifest里Service的常见属性说明
属性 | 说明 | 备注 |
---|---|---|
android:name | Service类名 | – |
android:label | Service名字 | 不填的话默认为Service类名 |
android:icon | Service图标– | |
android:permission | 申明此Service的权限 | 有提供了该权限的应用才能控制或连接此服务 |
android:process | 表示该服务是否运行在另外的进程[远程服务] | 不设置默认为本地服务;remote则设置成远程服务 |
android:enabled | 系统默认启动 | true:Service 将会默认被系统启动;不设置则默认为false |
android:exported | 该服务是否能够被其他应用程序所控制或连接 | 不设置默认此项为 false |
Service 与 Thread的区别
Service和Thread完全是两种概念,之所以提出来是因为Service的后台概念,导致很多人误解。
类型 | 相同点 | 不同点 |
---|---|---|
Service | 执行异步操作 | 运行在主线程;不依赖与UI,只要进程在,Service就可以运行;所以的Activity都可以与Service进行通信;处理耗时操作需要在Service中创建Thread子线程进行 |
Thread | 执行异步操作 | 单独开辟一个子线程;依赖某个Activity;其他Activity无法对其进行操作;很难对其控制;当前Activity销毁后,无法获取之前的线程实例 |
注:一般会将 Service 和 Thread联合着用,即在Service中再创建一个子线程(工作线程)去处理耗时操作逻辑,如下代码:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//新建工作线程
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
class MyBinder extends Binder {
public void service_connect_Activity() {
//新建工作线程
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
}
}