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

Activity总结和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110064346
Android Binder&Aidl理解和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/109862316
handler总结和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110293636
<Service史上最全面解析>理解和补充:
https://blog.csdn.net/fdsafwagdagadg6576/article/details/110696288
四大组件总结:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110631418

目录

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

1. 定义作用特点

  • 作用:提供 需在后台长期运行的服务
    Service不需要界面,提供一种服务.在后台执行耗时的操作.比如:下载文件,数据库操作.

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

  • 特点:无界面、在后台运行、生命周期长

Activity 没有windows就是sevice,Service是四大组件

2. Service 生命周期

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 进程.进程如果被回收,service就消失了.进程的退出见附录
2.3 bindService and startservice 连用
startService常驻后台,不随activity退出而退出。同时activity 可以通过bindService进行通信。
https://blog.csdn.net/dongbeitcy/article/details/77773467

3. 类型

3.1 具体分类

3.2 详细介绍

4 通信

4.1 Activity与remote service 通信
属于跨进程通信,需要使用aidl. Aidl定义的接口函数在service中实现.
参见: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
注意事项:很多文章将Binder框架定义了四个角色:Server,Client,ServiceManager、以及Binder驱动,
但这容易将人引导到歧途:好像所有的Binder服务都需要去ServiceManager去注册才能使用,其实不是这样。
例如,平时APP开发通过bindService启动的服务,以及有些自己定义的AIDL远程调用,都不一定都ServiceManager注册这条路,
个人理解:ServiceManager主要功能是:管理系统服务,比如AMS、WMS、PKMS服务等,而APP通过的bindService启动的Binder服务其实是由SystemServer的ActivityManagerService负责管理。
getService 和addService是两条路线.

addService,bindService,getService区别?
系统服务一般都是通过ServiceManager的addService进行注册的,这些服务一般都是需要拥有特定的权限才能注册到ServiceManager。
使用系统服务一般都是通过ServiceManager的getService得到服务的句柄,这个过程其实就是去ServiceManager中查询注册系统服务。
bindService启动的服务,主要是去ActivityManagerService中去查找相应的Service组件,最终会将Service内部Binder的句柄传给Client。
 4.2 Activity与local service 通信
因为两个class在同一个进程 activity直接用service.binder对象,所以可以直接组合。然后binder调用实现函数
实例参见:https://blog.csdn.net/shaw1994/article/details/43854553
注意:本地通信在一个进程之内,不需要aidl,不用binder.transact,不用binderProxy.
仅仅用类的结合,调用binder对象中的业务逻辑函数即可. 

5 使用实例

参见:Android四大组件:Service史上最全面解析 https://www.jianshu.com/p/e04c4239b07e

补充:service通常使用getSystemService,比如:AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
自定义的service需要添加到servicemanager中:ServiceManager.addService("MYSERVICE", new MyService());
自定义service 参考:https://www.jb51.net/article/122331.htm

注意: 当connect 变化的时候,触发onServiceConnected。这个是固定用法.

bindService(intent, conn, Context.BIND_AUTO_CREATE)//参数2是connect变化的callback
private ServiceConnection conn = new ServiceConnection() {
        /** 获取服务对象时的操作 */
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            countService = ((CountService.ServiceBinder) service).getService();
        }
        ......
};

6 service用法

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

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

  • 一方面不需要自己去new Thread
  • 另一方面不需要考虑在什么时候关闭该Service
    实际和方法1)是一样的,只是将方法1)封装完成. 使用方法参见:jianshu.com/p/be97093783d6.
    intentService的原理thread+handle.子线程sendmsg发送,handlemessage接收.

3) 独立service进程

QA:  1: service,activity和thread关系?service是在进程还是线程?
本地 service和activity在同一个主线程(UI线程),手机back键会使activity退出,但是service并不退出,整个app进程没有退出.
远程 service是独立进程.
AndroidManifest
android:process=”com.xxx.xxxservice”配置到单独的进程中
android:process=":remote"
2: service 和 thread什么关系?service常使用thread做后台服务.
3  service,UI线程 ,broadcast onReceive 不能处理耗时操作,耗时操作在线程中运行。
4 activity 与独立service进程通信,参见后文通信部分。

 7 源码分析

startService源码设计

bindService 源码设计

附录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: 参考Android Service完全解析,关于服务你所需知道的一切(上)
https://blog.csdn.net/guolin_blog/article/details/11952435

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值