Android Service服务

作者: AKyS佐毅 | 来源:发表于2017-10-17 21:26 被阅读43次

一.基础知识

1.Service是什么?

  • Service是一个一种在后台执行长时间运行操作而没有用户界面的应用组件。不能做耗时操作。

2.进程

  • Service是一种不提供用户交互页面但是可以在后台长时间运行的组件,可以通过在AndroidManifest.xml设置Service的android:process=":remote"属性,让Service运行另一个进程中,也就是说,虽然你是在当前应用启动的这个Service,但是这个Service和这个应用并不是同一个进程。

四大组件都支持android:process=":remote"这个属性。

因为Service可以运行在不同的进程,这里说一下Android中几种进程的优先级,当系统内存不足时候,系统会从优先级低的进程开始回收,下面根据优先级由高到低列出Android中几种进程。

  • 前台进程,当前用户操作所需要的进程
    • 用户正在交互的Activity(Activity执行了onResume方法)
    • 与正在交互的Activity绑定的Service
    • 设置为前台权限的Service(Service调用startForeground()方法)
    • 正在执行某些生命周期回调的Service,onCreate()、onStart()、onDestroy()
    • 正在执行onReceive()的BroadcastReceiver
      这种进程基本不会被回收,只有当内存不足以支持前台进程同时运行时候,系统才回回收它们,主要关注前三个。
  • 可见进程,没有与用户交互所必须的组件,但是在屏幕上仍然可见其内容的进程
    • 调用了onPause()方法但仍对用户可见的Activity
    • 与上面这种Activity绑定的Service
  • 服务进程,使用startService()启动的Service且不属于上面两种类别进程的进程,虽然这个进程与用户交互没有直接关系,但是一般会在后台执行一些耗时操作,所以,只有当内存不足以维持所有前台进程和可见进程同时运行,系统才回回收这个类别的进程。
  • 后台进程,对用户不可见的Activity进程,已调用了onStop()方法的Activity
  • 空进程,不包含任何活动应用组件的进程,保留这种进程唯一目的是作为缓存,缩短引用组件下次启动时间。通常系统会最优先回收这类进程。

此外,一个进程的级别可能会因为其他进程对它的依赖而有所提高,即进程A服务于进程B(B依赖A),那么A的进程级别至少是和B一样高的。

3. Service配置

和其他组件(Activity/ContentProvider/BroadcastReceiver)一样,Service需要在Androidmanifest.xml中声明。

Service.png

Service是运行在主线程中的,如果有什么耗时的操作,建议新建子线程去处理,避免阻塞主线程,降低ANR的风险。

4. 服务启动方式

服务可以由其他组件启动,而且如果用户切换到其他应用,这个服务可能会继续在后台执行。到目前为止,Android中Service总共有三种启动方式。

  • Scheduled,可定时执行的Service,是Android 5.0(API LEVEL 21)版本中新添加的一个Service,名为JobService,继承Service类,使用JobScheduler类调度它并且设置JobService运行的一些配置。具体文档可以参考JobScheduler,如果你的应用最低支持版本是21,官方建议使用JobService。
  • Started,通过startService()
    启动的Service。通过这种方式启动的Service会独立的运行在后台,即使启动它的组件已经销毁了。例如Activity A使用startService()启动了Service B,过了会儿,Activity A执行onDestroy()被销毁了,如果Service B任务没有执行完毕,它仍然会在后台执行。这种启动方式启动的Service需要主动调用StopService()停止服务。
  • Bound,通过bindService()
    启动的Service。通过这种方式启动Service时候,会返回一个客户端交互接口,用户可以通过这个接口与服务进行交互,如果这个服务是在另一个进程中,那么就实现了进程间通信,也就是Messenger和AIDL,这个会是下篇文章的重点。多个组件可以同时绑定同一个Service,如果所有的组件都调用unbindService()解绑后,Service会被销毁。

startService和bindService可以同时使用

服务一般分为两种:

1:本地服务, Local Service 用于应用程序内部。

  • 在Service可以调用Context.startService()启动,调用Context.stopService()结束。 在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次 stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。

  • 可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服 务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加 载它。提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

那么先来看Service的生命周期吧:

Service生命周期.png
  • context.startService() ->onCreate()- >onStartCommand()->Service running--调用context.stopService() ->onDestroy()

  • context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()

从上诉可以知道分别对应本地的,,以及远程的,也对应不同的方式启动这个服务。

二.注意事项

2.1 同一服务,多次启动,服务实际执行的过程

  • 第一次 启动服务时,运行 onCreate -->onStartCommand
    后面在启动服务时,服务只执行onStartCommand。在实际使用过程中,通过Intent 传递数据,在OnStartCommand中执行。

具体代码如下:

Service.png onStartCommand.png startService.png bindService.png

相关文章

  • Android服务的启动模式

    Android 服务两种启动方式的区别 关键字:Android Service服务的启动和停止方式 Service...

  • Android 学习之Service

    什么是Service? Service,俗名服务。在Android系统中,Service与Activity就...

  • Android Service

    Android Service(服务) 服务的定义服务是Android中实现后台运行的解决方案。 android多...

  • IntentService学习-Service/Handler相

    前言 Service服务是Android四大组件之一,在Android中有着举足重轻的作用。Service服务是工...

  • Android Service学习笔记

    参考:Android Service完全解析,关于服务你所需知道的一切(上)Android Service完全解析...

  • Android Start Service与Bind Servi

    1.什么是Service Service是Android四大组件之一,是系统服务。Service是运行在后台的服务...

  • Service(服务)

    Service为Android四大组件之一 目录 什么是Service? 服务的基本用法 Android-8.0的...

  • Service 使用方法详解

    Service 是Android四大组件之一(Activity 活动,Service 服务,ContentProv...

  • service

    服务是什么 “Service” 意思即“服务”的意思, Service是Android中实现程序后台运行的解决方案...

  • Service和线程的区别

    服务(Service) Service是android的一种机制,当它运行的时候如果是Local Service,...

网友评论

    本文标题:Android Service服务

    本文链接:https://www.haomeiwen.com/subject/zgjjuxtx.html