《Service史上最全面解析》理解和补充

2020-11-30  本文已影响0人  mfdalf

Android 四大组件:activity显示,service后台服务,broadcast通信, contentProvider 数据共享.
相关系列文章:
Activity总结和补充:https://www.jianshu.com/p/bd31881c28fc
Android Binder&Aidl理解和补充:https://www.jianshu.com/p/eb791ae04e2f
Service史上最全面解析》理解和补充: https://www.jianshu.com/p/444af9739135
Handler总结和补充:https://www.jianshu.com/p/a041c41af27d

目录

image
《Service史上最全面解析》地址:https://blog.csdn.net/carson_ho/article/details/53160049.
本文是在读完上面blog之后,对没有完全理解的service内容的补充.

1. 定义作用特点

如:复杂计算、音乐播放、下载等

2. Service 生命周期

image

image2.1 启动和结束
startService 启动,stopService 结束.
bindService 绑定service分成两种情况:1):先startService然后bindService.2):如果service已经启动,直接bindService.
unbind 用于解绑service.
startSerivce和bindService启动分成两种场景,第一次启动&其他次启动。
1) startSerivce
它的生命周期很简单,分别为onCreate、onStartCommand、onDestroy这三个。
第一次创建Service会回调onCreate()方法,然后回调onStartCommand()方法。
再次startService()的时候,就只会执行onStartCommand(),不会执行onCreate。
2) bindService
使用bindService启动的话执行的方法onCreate--->onbind,而且这种方法启动的话,
第一次bind service会调用onbind。
再点击bindService按钮启动服务,onbind方法就不会再执行了。
2.2 bindService and startservice 区别?

作用 通信 与调用者关系 结束 特点
startService 开启service 所有activity都可以bind这个service通信 没有依赖关系.不依赖于启动它的activity,调用者被系统回收或者调用了onDestroy方法,Service还会继续存在 stopService 常驻内存.有些像server的属性
bindService 绑定Service或者开启并绑定Service 仅仅与调用者通信 有依赖关系。bindService启动的service可以由unbindservice来结束,也可以在Activity结束之后(onDestroy)自动结束.即调用者挂了,service也会跟着挂掉 unbind或者activity退出之后自动结束 有些像client的属性

小结:两者的区别有两点,第一:能不能通信,第二 如何结束。
notes: 手机按back键退出,是退出activity,不是app 进程.进程的退出见附录
2.3 bindService and startservice 连用
startService常驻后台,不随activity退出而退出。同时activity 可以通过bindService进行通信。
https://blog.csdn.net/dongbeitcy/article/details/77773467

3. 类型

3.1 具体分类

image

示意图

3.2 详细介绍

image

3.3 应用场景

都需要将该服务注册到配置文件AndroidManifest.xml中如何实现远端service.
1)运行地点
本地服务(Local Service):用于应用程序内部. 实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。
远程服务(Remote Sercie):用于android系统内部的应用程序之间.可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。

  1. 运行类型
    前台:比如notify service .后台,比如:download文件
    android自动回收机制可能回收后台service进程。
  2. 功能

4 service处理耗时操作?(service 主要作用)

一共有3种方法,service中启动线程处理,intentService和remote service.

  1. local service中启动线程处理
    local service 和activity一样,也是在主线程中,如果在service中处理耗时操作,会影响到主线程,所以在service中启动线程处理.
    为什么不在activity中启动线程?
    既然service也要启动线程,为什么不在activity中启动线程。因为activity退出之后,activity启动的线程就失去控制。
    而service常驻内存,不会因为activity退出而退出,可以一直管理启动的线程.
    notes:父线程退出子线程不会退出.主线程退出导致进程退出,所有线程都会退出。
  2. intentService

IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题.
优点:

  1. 独立service进程


    image

    QA service,activity和thread关系?
    service是在进程还是线程?
    local service和activity在同一个主线程(UI线程),手机back键会使activity退出,但是service并不退出,整个app进程没有退出.
    remote service是独立进程.
    AndroidManifest
    android:process=”com.xxx.xxxservice”配置到单独的进程中
    android:process=":remote"

activity 与独立service进程通信,参见后文通信部分。
notes: service不能处理耗时操作,那么service处理什么呢??

4 通信

4.1 activity与local service 通信
因为两个class在同一个进程 activity直接用service.binder对象,所以可以直接组合。然后binder调用实现函数
实例参见:https://blog.csdn.net/shaw1994/article/details/43854553
注意:本地通信在一个进程之内,不需要aidl,不用binder.transact,不用binderProxy.
仅仅用类的结合,调用binder对象中的业务逻辑函数即可.

image
4.2 activity与remote service 通信
属于跨进程通信,需要使用aidl. 参见:Binder&Aidl https://blog.csdn.net/fdsafwagdagadg6576/article/details/109862316中的aidl部分.
这里补充一下service 和binder是什么关系?
两者是组合关系,service类使用binder类. binder对象是service类中的一个成员变量。
Android中2种方法来获得service IBinder的方法.
  1. bindService
    //binderService 可以在onServiceConnected()里取回这个Service的IBinder引用.
    bindService(intent, serviceConnection , BIND_AUTO_CREATE)
    private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
    }
    ......
    };
    使用之后,用unbind释放了binder。
  2. getService
    通过ServiceManager.getService(String Descriptor)来获得Service Manager管理的service的IBinder。
    // 从ServiceManager中获取服务; asInterface 关键函数,通过binder获取
    myservice = IMyService.Stub.asInterface(ServiceManager.getService("MYSERVICE"));
    notes:addService向serviceManager中添加service
    小结:两者的获取路线不同。bindService较常用.
    image
    附录1:
    1 关闭进程:
    通过直接杀死当前应用的进程来结束应用,简单粗暴!(不推荐!不推荐!不推荐!!)
    方式一: android.os.Process.killProcess(android.os.Process.myPid());
    方式二: System.exit(0);
    方式三(需要权限: requires android.permission.KILL_BACKGROUND_PROCESSES):
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    manager.killBackgroundProcesses(getPackageName());
    这三种都能达到退出应用的效果。但是部分真机会直接失效,或者只能finish当前Activity,国产ROM改动太多,不建议使用相关方法。
    2 Service manager和service 关系?
    理解为:service是类,service manager管理它。service manager仅仅是注册。startService才负责启动,运行是在主线程中。启动&运行与service manager没关系
    servicemanger 和activitymanagerservice什么关系?
    serviceManager主要功能是:管理系统服务,比如AMS、WMS、PKMS服务等,
    而APP通过的bindService启动的Binder服务其实是由SystemServer的ActivityManagerService负责管理.
    附录2: 参考Android Service完全解析,关于服务你所需知道的一切(上)
    https://blog.csdn.net/guolin_blog/article/details/11952435
上一篇下一篇

猜你喜欢

热点阅读