Android 短时间内多次启动同一个Service会不会有多次的binder调用

背景:笔者刚接触公司的新项目,发现项目中有些场景居然在短时间内(几十毫秒内)发送同一个Service,本来功能没有什么大问题,但是笔者有点怀疑:短时间内发送多个相同的Service会不会影响性能?因为启动服务涉及到binder通信,ANR问题里就有一类是关于binder耗时的,特别是在低端机器,CPU繁忙,内存不足,然后短时间又有多次binder调用的话。

于是笔者问了好几个同事和朋友:短时间内多次启动同一个Service会不会有多次的binder调用。没想到这个问题形成了两派:

A :有多次binder调用, 多次启动同一个服务会走onStartCommand了肯定有onTransact

B :没有多次,如果启动的服务的是同一个进程的服务,那么没有binder调用

各位看官,你们觉得呢?

笔者潜意识里认为是有的,但是没有证据,所以记录下这个找证据的过程。

找证据的过程其实就是看源码过程了,笔者看的是android 31的源码,由于源码冗长,所以只截取关键路径源码:

1. 应用进程

 

  

2. system_server进程

 在ActiveServices里经过一系列调用会通过ApplicationThread代理调用scheduleServicesArgs回到应用进程:

3. 应用进程: 

 

所以,短时间内启动同一个Service, 不管启动的服务是不是同一个进程都会涉及binder调用的,而且还是两次。如果启动的服务如果是另外的进程,system_server还会发socket 通知zygote fork出一个新进程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值