Android Service调用流程解析

Android Service调用流程解析,第1张

Service是面试中经常问到的一个模块,从之前的简单使用,到后期的应用保活,当然现在Android系统对这种保活机制进行了优化和限制,我们先简单了解下Service的特性。

接下来的文章主要以一问一答的方式进行介绍Service的特性,必要部分也会分析到Service的源码逻辑

Service(服务)一个运行在后台执行长时间运行的 *** 作组件,它不提供任何用户界面,作为与Activity同级的组件,它依旧是运行在主线程中。

其它组件可以启动一个Service,当这个Service启动之后便会在后台执行,这里需要注意,由于是在主线程中,所以我们需要另外开启一个线程来执行我们的耗时 *** 作。

此外,一个组件还可以与一个Service进行绑定来实现组件之间的交互,甚至可以执行IPC(Inter-Process Communication)进程间通信。

Service可以在后台执行很多任务,比如处理网络事务,播放音乐,文件读写或者与一个内容提供者交互,等等。

本地服务(Local)

该服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外本地服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多,当主进程被Kill后,服务便会终止。一般使用在音乐播放器播放等不需要常驻的服务。

远程服务(Remote Service)

该服务是独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。一般定义方式 android:process=":service" 由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。由于是独立的进程,会占用一定资源,并且使用AIDL进行IPC比较麻烦。一般用于系统的Service,这种Service是常驻的。

startService启动的服务

用于启动一个服务执行后台任务,不与组件进行通信,停止服务使用stopService。 当一个应用组件比如activity通过调用startService()来启动一个服务的时候,服务便处于启动状态。一旦启动,服务可以在后台无限期地运行下去,即使当启动它的组件已经销毁。通常情况下,一个启动的service执行一个单一的 *** 作并且不会返回任何结果给调用者。

bindService启动的服务

用于启动的服务需要进行通信。停止服务使用unbindService。 当一个应用组件通过调用bindService()来与一个服务绑定时,服务便处于绑定状态。一个绑定的服务提供了一个客户端-服务器端接口来允许组件与服务进行交互,发送请求,得到结果甚至通过IPC进程间通信来完成 *** 作。只有当其它组件与服务进行绑定时,服务才会处于绑定状态。多个组件可以同时与服务绑定,但是当他们全部都解除绑定时,服务就会销毁。

2BindService:

如果一个Service在某个Activity中被调用bindService方法启动,不论bindService被调用几次,Service的 onCreate 方法只会执行一次,同时 onStartCommand 方法始终不会调用。当建立连接后,Service会一直运行,除非调用unbindService来接触绑定、断开连接或调用该Service的Context不存在了(如Activity被Finish——即通过bindService启动的Service的生命周期依附于启动它的Context),系统在这时会自动停止该Service。

3StartService AND BindService:

当一个Service在被启动(startService 的同时又被绑定(bindService ),该Service将会一直在后台运行,并且不管调用几次, onCreate 方法始终只会调用一次, onStartCommand 的调用次数与startService 调用的次数一致(使用bindService 方法不会调用 onStartCommand )。同时,调用unBindService 将不会停止Service,必须调用stopService 或Service自身的stopSelf 来停止服务。

4停止Service:

当一个服务被终止(stopService 、stopSelf 、unbindService )时, onDestory 方法将会被调用——所以我们需要在该方法中清除一些工作(依附该Service生命周期上的,比如:停止在Service中创建并运行的线程)。

1创建服务

如果你才用的是 startService的方式那么 onBind方法可以忽略

2注册服务

3开启服务

start:

bind

绑定服务,一般涉及到组件或进程之间的通信,既然需要通信,那么我们肯定需要一个连接,这里ServiceConnection就是我们所需要的连接,通过Ibinder的传递,我们可以获取到Service的Ibinder对象,从而进行相关 *** 作。

关于粘性服务,这里需要提到 Service的onStartCommand返回值

andorid:name

adroid:exported

android:enabled

android:label

android:process

android:icon

android:permission

关于服务,当我们在应用开发中,如果需要长时间的在后台运行,独立完成某一些事情的情况下,请使用Service!

此文综合: >

在service中做一个activity的集合

再做一个addActivity的方法和findActivity的方法

将你需要调用handler的activity通过addActivity方法放到service的activity集合中

需要用的时候用findActivity从activity把那个对象取出来

在前台不可见,但是承担大部分数据处理工作(劳模),它和Activity的地位是并列的,区别在于:Activity运行与前台,Service运行于后台,没有图形用户界面,通常他为其他的组件提供后台服务或监控其他组件的运行状态。

service的生命周期:

需求:既要保证服务长期在后台运行,又想去调用服务里面的方法

技巧:1先开启服务 2绑定服务

音乐播放器

43 添加权限

进程就是正在进行中的程序,它是系统分配资源的基本单位,线程就是一次单一顺序的执行控制流, 一个进程里面可以有多个线程,一般情况下,一个应用程序会对应一个进程,关闭应用就是关闭了所有的界面,关闭所有的activity,应用程序的进程是不会关闭掉的,仍然在后台长期的运行,当系统内存不够用的时候会优先关闭空进程和后台进程。

采用一组组策略,帮助我们自动的管理进程,进程按照优先级分为不同的等级:

Messenger封装了Binder和Handler,有了Handler,Messenger就可以发送消息了,有了Binder,Messanger就可以远程通信了

结果:客户端拿到了服务端的信使使用binder构造,服务端拿到了客户端信使使用消息携带,然后就可以互发信息了

服务端:

客户端:

客户端和服务端通信协议解决了两个问题,服务端和客户端约定了方法参数列表顺序;约定了方法的ID标识

服务端:

客户端:

IMyServiceaidl

Studentjava

总结:

1,6简单粗暴可以保证完全存活

4,5常用的方案

2,3比较轻量级

将Service设置为前台服务:(startForeground(int, Notification))

编码通过双服务实现服务长存?

>

来看一下如何才能创建一个前台Service吧,其实并不复杂,如下所示:

这里只是修改了Service中onCreate()方法的代码。可以看到,我们首先创建了一个Notification对象,然后调用了它的setLatestEventInfo()方法来为通知初始化布局和数据,并在这里设置了点击通知后就打开MainActivity。然后调用startForeground()方法就可以让MyService变成一个前台Service,并会将通知的显示出来。

为降低功耗,无论应用的目标 SDK 版本为何, Android 80 都会对后台应用检索用户当前位置的频率进行限制。

系统会对前台应用和后台应用进行区分。应用满足以下任一条件即视为前台应用:

如果应用在运行 Android 80 的设备上处于前台,其位置更新行为将与 Android 711 (API 级别 25)及更低版本上相同。

调用 startForeground(NOTIFY_ID, noHelpergetNotification()); ,让服务运行于前台,此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification 。

但是,如果您在服务正在前台运行时将其停止,则通知也会被移除。

FrontNotificationHelper 类构建一个通知,并通过 getNotification() 将 Notification 返回到 FrontService 。

目前主要使用的定位功能是 GPS 定位和百度地图的定位服务。

我们不在 FrontService 直接调用 GPSLocationProvider 或者 BaiduLocationProvider ,而是另外再封装一层 LocationHelper ,在 LocationHelper 中调用位置服务。

这样做的好处是可以在 FrontService 切换使用 GPSLocationProvider 或者 BaiduLocationProvider ,而且 FrontService 中调用不变。

robot类里面有一个方法能获取屏幕像素 robot.getPixelColor(int x int y)返回color 对象然后color 对象里面有一个方法返回rgb值 color.getRGB()

以上就是关于Android Service调用流程解析全部的内容,包括:Android Service调用流程解析、Android 之 Service(一)启动,绑定服务、Android中,由Activity启动一个Service,Service如何获得启动它的Activity对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9472802.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存