Hi,大家好,上一期我们讲了如何使用BroadcastReceiver,这一期我们讲解Android四大组件之Service相关知识。每天一篇技术干货,每天我们一起进步。
耐心专注不仅仅是美德,更是一笔财富。
1.简介与定义
简介
Service
是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。Service可由其他应用组件启动,而且即使用户切换到其他应用,Service仍将在后台继续运行。 此外,组件可以绑定到Service,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,Service可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
定义
Service
1.Service
不是一个单独的进程;
2.Service
也不是一个单独的线程;
3.Service
是一个单独的Android组件,Service运行在主线程上,如果想在Service中处理很占时间的操作时,必须在Service中开线程,以降低Activity没有响应的风险;
4.Service
不提供用户界面;
它有两种启动方式:startService
和bindService
。
2.用途
Service有三个常见用途。
1.功能调度:Service接收指定的广播信息,从而进一步分析和处理事件,最后修改数据、更新界面或者进行其他相关的操作,调度整个应用使其保持正确的状态。
2.功能提供:Service并不会接收任何的广播,只接收指定的广播提供状态数据,这时需要绑定Service,绑定Service时要管理好Service,一般在Activity的onStop函数里进行解绑unBindService操作。
3.远程调用:定义AIDL服务,跨进程调用Service,先定义一个远程调用接口,然后为该接口提供一个IBinder实现类,客户端获取了远程的Service的IBinder对象的代理后,通过该IBinder对象去回调远程Service的属性或方法。
3.应用场景
如果某个程序组件需要在运行时向用户呈现界面,或者程序需要与用户交互,就需要用Activity,否则就应该考虑使用Service。
4.Service与Activity对比
相似点:
1.都是单独的Android组件;
2.都拥有独立的生命周期;
3.都是Context的派生类,所以可以调用Context类定义的如getResources()
、getContentResolver()
等方法;
4.都拥有自己生命周期回调方法;
不同点:
1.Activity运行于前台有图形用户界面,负责与用户交互;Service通常位于后台运行,不需要与用户交互,也没有图形用户界面。
5.Service的生命周期
随着应用程序启动Service方式不同,Service的生命周期也略有差异,如下图:
如果应用程序通过startService()方法来启动Service,Service的生命周期如上图左半部分所示。
通过调用startService() 方法启动Service: 当其他组件调用startService()方法时,Service被创建,并且无限期运行,其自身必须调用stopSelf()方法或者其他组件调用stopService() 方法来停止Service,当Service停止时,系统将其销毁。
如果应用程序通过bindService()方法来启动Service,Service的生命周期如上图右半部分所示。
通过bindService() 方法启动Service: 当其他组件调用bindService()方法时,Service被创建。接着客户端通过IBinder接口与Service通信。客户端通过unbindService() 方法关闭连接。多个客户端能绑定到同一个Service,并且当他们都解除绑定时,系统将销毁Service(Service不需要被停止)
特别说明:当Activity调用bindService()绑定一个已通过startService()启动的Service时,系统只是把Service内部的IBinder对象传给Activity,并不会把该Service生命周期完全绑定到该Activity,因而当Activity调用unBindService()方法取消与该Service的绑定时,也只是切断该Activity与Service之间的关联,并不能停止该Service组件。要停止该Service组件,还需调用stopService()方法。
在Service
的生命周期里,常用的有:
4个手动调用的方法
手动调用方法 | 作用 |
---|---|
startService() | 启动服务 |
stopService() | 关闭服务 |
bindService() | 绑定服务 |
unbindService() | 解绑服务 |
5个自动调用的方法
内部自动调用的方法 | 作用 |
---|---|
onCreate() | 创建服务 |
onStartCommand() | 开始服务 |
onDestroy() | 销毁服务 |
onBind() | 绑定服务 |
onUnbind() | 解绑服务 |
6.Service的使用
当我们开始使用Service
的时候当然是启动一个Service了,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,下面我们就通过一个具体的例子来看一下。
public class MyService extends Service { public static final String TAG = "MyService"; @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate() executed"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand() executed"); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy() executed"); } }
要创建一个这样的Service,你需要让该类继承Service类,然后重写以下方法:
-
onCreate() 1.如果service没被创建过,调用startService()后会执行onCreate()和onStartCommand(