美文网首页
技术查缺Android篇 Sevice和IPC机制(面试题)

技术查缺Android篇 Sevice和IPC机制(面试题)

作者: 时间领主timeloader | 来源:发表于2019-08-23 17:55 被阅读0次

    这一篇主要用来补缺Service部分和IPC。

    Service

    1 Service的生命周期.

    • onCreate():服务第一次被创建时调用
    • onStartComand():服务启动时调用
    • onBind():服务被绑定时调用
    • onUnBind():服务被解绑时调用
    • onDestroy():服务停止时调用

    2 Service的启动方式

    Service有两种启动方式:本地启动(Local)和远程启动(Remote),

    • Local方式
      其他组件调用ContextstartService() 方法可以启动一个Service,并回调服务中的onStartCommand()。如果该服务之前还没创建,那么回调的顺序是onCreate()->onStartCommand()。服务启动了之后会一直保持运行状态,直到 stopService()stopSelf() 方法被调用,服务停止并回调onDestroy()。另外,无论调用多少次startService()方法,只需调用一次stopService()stopSelf()方法,服务就会停止了。
    • Remote方式
      其它组件调用ContextbindService() 可以绑定一个Service,并回调服务中的onBind()方法。类似地,如果该服务之前还没创建,那么回调的顺序是onCreate()->onBind()。之后,调用方可以获取到onBind()方法里返回的IBinder对象的实例,从而实现和服务进行通信。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态,直到调用了 unbindService() 方法服务会停止,回调顺序onUnBind()->onDestroy()

    这里需要注意的是,本地启动的方式试运行activity的主线程上的,但是远程启动方式,启动的是在独立的进程主线程上这个要注意,他是可以独立于app进程,即使app关闭,这个线程也可以独立维护,比如微信的聊天监控服务和jpush等推送服务都是属于远程服务。

    3 ActivityManagerService的作用

    ActivityManagerServiceAndroid中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似,详见ActivityManagerService分析

    4 如何保证Service不被杀死

    根据收集到的效果比较好的有下面几个方法:

    • ServiceonStartCommand()中设置flages值为START_STICKY,使得Service被杀死后尝试再次启动Service
    • 提升Service优先级,比如设置为一个前台服务
    • ActivityonDestroy()通过发送广播,并在广播接收器的onReceive()中启动Service.

    5 IPC是什么以及存在的价值

    IPC,InterProcess Communication,指的是多进程通信,由于Android是从linux核,它的设计也类似由于每个app的进程之间是被隔离的,所以我们无法直接访问以及进行通信,我们这个时候就需要依靠其他办法来通信,具体的通信方式有:

    • Message 通信,一般安卓四大组件之间
    • 用文件共享 ---->用于单线程读写
    • .AIDL ,主要用于调用远程服务的方法的情况 还可以注册接口。用法比较比以上两种复杂,但是能够传递复杂类型,可进行稳定传送。
    • ContentProvider方式 实现对另一个应用进程开放provider数据的查询

    另外多进程会导致以下几个问题

    • 静态变量和单例模式失效:由独立的虚拟机造成
    • 线程同步机制失效:由独立的虚拟机造成
    • SharedPreference的不可靠下降:不支持两个进程同时进行读写操作,即不支持并发读写,有一定几率导致数据丢失
    • Application多次创建: Android系统会为新的进程分配独立虚拟机,相当于系统又把这个应用重新启动了一次。

    6 谈谈Binder

    Binder,中文翻译粘合剂,它从应用层来说就是 ,服务端中的Service给与其绑定的客户端提供Binder对象,客户端通过AIDL接口中的asInterface()将这个Binder对象转换为代理Proxy,并通过它发起RPC请求。客户端发起请求时会挂起当前线程,并将参数写入data然后调用transact(),RPC请求会通过系统底层封装后由服务端的onTransact()处理,并将结果写入reply,最后返回调用结果并唤醒客户端线程。


    网络图片(来自厘米姑娘博客)

    相关文章

      网友评论

          本文标题:技术查缺Android篇 Sevice和IPC机制(面试题)

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