- Service组件一直在后台运行,没有用户界面,也需要再AndroidManifest.xml中配置Service,Android系统本身提供了大量Service组件,用于访问Android
- Service的生命周期:
- Service类中定义了一系列方法,如:
- onBind:是必须实现的一个方法,返回一个绑定的接口IBinder,用于与Service通信
- onCreate:当Service第一次被创建时由系统调用。
- onStartCommand:当通过startService方法启动Service时,该方法被调用
- onDestroy:当Service被关闭之前,系统调用该方法.
- onUnbind:当Service上绑定的所有客户端都断开连接时将回调该方法
- 使用Context.startService(Intent intent)方法,类似与启动一个Activity,用该方法启动的service访问者与该service没有联系,无法进行通信和数据访问,访问者退出了,service仍可以运行,当我们调用startService方法时,被调用的Service会调用它的onCreate方法,接着调用onStart方法,一旦Service启动将一直运行到调用Context.stopService()或者stopSelf()。
- 另种调用Service的方法是通过bindService()来绑定一个Service,Service会调用onCreate方法来创建Service,但是它不会调用onStart,而是调用onBind返回一个IBinder接口,绑定Service一般用于远程Service调用,bindService(intent intent,ServiceConnection conn,Service.BIND_AUTO_CREATE)该方法启用service,并会执行Service.onBind方法,该方法会返回IBinder.访问者与service绑定在一起,访问者退出
onBind返回的IBinder作为ServiceConnection.onServiceConnected的第二个参数用于与Service通信
当Activity调用bindService绑定一个已启动的Service时,系统只是把IBinder对象传给Activity.此时要销毁Service必须先调用unbindService和stopService两个方法
Service中通常启动新线程处理后台任务,即使Activity被销毁也不会影响执行。Service运行在UI线程中,执行耗时操作也会抛ANR异常。另外Service系统优先级较低,当系统内存不足时有可能首先被回收,为了防止Service被系统kill,可以用 startForeground(id,notification)把service变为前台Service
Android平台中各个组件运行在自己的进程中,进程间相互通信使用RPC,并且Android通过接口定义语言来生成两个进程之间相互访问的代码
IntentService:使用队列管理Intent请求,有新Intent请求时,就会把Intent加入队列,启动一个新的worker线程来处理Intent,不会阻塞主线程,具有如下特性:
- IntentService会创建单独的worker线程来运行onHandleIntent方法
- 所有请求处理完成后IntentService会自动终止,开发者无需执行stopService
- 为service的onstartCommand方法提供了默认实现,该实现将请求Intent加到队列中