Android Service

  1. Service组件一直在后台运行,没有用户界面,也需要再AndroidManifest.xml中配置Service,Android系统本身提供了大量Service组件,用于访问Android

  2. Service的生命周期:
  3. Service类中定义了一系列方法,如:
    • onBind:是必须实现的一个方法,返回一个绑定的接口IBinder,用于与Service通信
    • onCreate:当Service第一次被创建时由系统调用
    • onStartCommand:当通过startService方法启动Service时,该方法被调用
    • onDestroy:当Service被关闭之前,系统调用该方法.
    • onUnbind:当Service上绑定的所有客户端都断开连接时将回调该方法

  4. 若想使用Service必须在AndroidManif.xml配置文件中使用<service>元素声明该Service, 在其他组件中启动一个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绑定在一起,访问者退出

  5. ServiceConnection对象:该对象的方法在主线程中运行,监听访问者与service的连接情况,创建该对象时要实现其onServiceConnected()和onServiceDisconnected(),当访问者与Service之间连接成功时会回调onServiceConnected,当Service的宿主进程由于异常或者其他原因终止,导致Service与访问者之间的连接断开会回调onServiceDisconnected方法,此时到Service的绑定仍然存在,Service再次启动时仍会触发onServiceConnected方法,但调用者主动通过unBindService方法断开与service的连接时onServiceDisconnected方法不会被调用.
    onBind返回的IBinder作为ServiceConnection.onServiceConnected的第二个参数用于与Service通信


  6. 当Activity调用bindService绑定一个已启动的Service时,系统只是把IBinder对象传给Activity.此时要销毁Service必须先调用unbindService和stopService两个方法

  7. Service中通常启动新线程处理后台任务,即使Activity被销毁也不会影响执行。Service运行在UI线程中,执行耗时操作也会抛ANR异常。另外Service系统优先级较低,当系统内存不足时有可能首先被回收,为了防止Service被系统kill,可以用 startForeground(id,notification)把service变为前台Service

  8. Android平台中各个组件运行在自己的进程中,进程间相互通信使用RPC,并且Android通过接口定义语言来生成两个进程之间相互访问的代码

  9. IntentService:使用队列管理Intent请求,有新Intent请求时,就会把Intent加入队列,启动一个新的worker线程来处理Intent,不会阻塞主线程,具有如下特性:
    • IntentService会创建单独的worker线程来运行onHandleIntent方法
    • 所有请求处理完成后IntentService会自动终止,开发者无需执行stopService
    • 为service的onstartCommand方法提供了默认实现,该实现将请求Intent加到队列中




       

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。