android service和activity跨进程通讯

本文详细介绍了Android中Service的启动方式,包括startService和bindService的区别及其生命周期。阐述了Service如何通过startService单向传递数据以及通过bindService实现双向交互。同时,讲解了Binder的跨进程通讯原理,提供了实现Service间通讯的实例,包括通过Binder、Messenger和AIDL。此外,还解答了关于Service自启动、常驻、多调用管理等相关问题。
摘要由CSDN通过智能技术生成

一,service的两种启动方式

service 作为一个应用程序组件,则意味着它可以在不同组件间、甚至在 不同应用间进行复用,还意味着可以配置成在另一个独立的进程中运行。

startService单向传递数据

bindService可通过binder实现数据的交互以及监听。


两种方式的生命周期

service未启动,然后调用

startService:onCreate()->onStartCommand()-----service running -----onDestroy()

bindService:onCreate()->onBind()----------service running  -------onUnbind()->onDestroy()


service已经通过startService启动之后,再调用

startService:onStartCommand()-----service running -----onDestroy()

bindService:onBind()----------service running  -------onUnbind()->onDestroy()


service已经通过bindService启动之后,再调用

startService:onStartCommand()-----service running -----onDestroy()

bindService:----------service running  -------onUnbind()->onDestroy()

注意:这里的onBind()不再调用,因为binder已经存在并缓存起来,绑定service成功后会直接返回binder,并不需要再调用onBind()了。


onCreate()

该方法仅在 service 第一次被创建时会被系统调用,可以用来执行一些一次性的初始化操作。

也就是,无论startservice,bindservice多少次,就永远只有一个service。


onStartCommand()

一个应用组件(例如 Activity)可以通过调用 startService()并传入一个 Intent 来启动指定的 service,Intent 可以带上所需的数据,Service 会在 onStartCommand() 回调中收到该 Intent。
例如,假如一个 Activity 需要上传一些数据,则可以 start 一个service 并透 过 Intent 把需要保存的数据(或数据的路径)传入。service在 onStartCommand() 中 收到 Intent,可以提取出数据并上传。上传完毕,你需要负责在适当的时 候,通过调用 stopService() 或 stopSelf() 来停止 service 的运行。

onStartCommand() 方法返回了一 个整数,该整数描述了当系统杀掉你的 service 时,后续会如何处置你的 service。 该返回值的取值范围如下:
START_NOT_STICKY
如果你的 service 被杀掉了,将不会自动重启(除非系统中还有未处理的 intent 请求等待投递)。
START_STICKY
如果系统杀掉了 service,将会在资源不再紧张时重新启动你的 service, 并调用 onStartCommand() 方法。注意,该方法 不会 重新传入上次的 intent,而是传入一个 null intent(除非系统中有待投递的请求,则会传 入待投递请求的 Intent)。这种情况适合类似媒体播放器的应用, 这类 service 在启动时并非执行某个指令,而是持续运行并等待任务。
START_REDELIVER_INTENT
如果 service 被杀掉了,将会被重启并且会传入上一次的 intent,其他未 处理的 intent 将会依次被投递。该选项适合用来执行一些希望立即被恢复的 任务,例如下载文件


onBind()

要创建一个 bindservice,你必须实现 onBind() 回调方法,并返回一个 IBinder 供 client 使用。其他的应用组件通过调用 bindService() 来绑定你 的 service,并获得 IBinder 接口以便和你的 service 交互。

这类 service 存在的目的就是为了服务于 bind 它的其他组件,所以,一旦没有组件 bind 它 了,则会被系统销毁。就是说如果执行了unbindService(),那么service就有可能会被销毁。

多个 clients 可以同时 bind 一个 service,当所有 clients 通过调用 unbindService() 解除绑定时,系统便会销毁该 service。

当一个 service 被多个 clients 绑定时,onBind() 只 会在第一次绑定时被系统调用一次,用于获取 IBinder 实例,后续的 bind 操作 系统会直接返回相同的 IBinder 实例,而不再调用 onBind()。这点和 onStartCommand() 有很大的区别。


onDestroy()

Call

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值