android 11 bindService_安卓bindservice项目-程序员宅基地

技术标签: bindService  Android  

frameworks/base/core/java/android/content/ContextWrapper.java
 public boolean bindService(Intent service, ServiceConnection conn,
              int flags) {
          return mBase.bindService(service, conn, flags);
      }

private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,...

        IBinder token = getActivityToken();
        if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
                && mPackageInfo.getApplicationInfo().targetSdkVersion
                < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            flags |= BIND_WAIVE_PRIORITY;
        }
        service.prepareToLeaveProcess(this);
        int res = ActivityManager.getService().bindIsolatedService(
            mMainThread.getApplicationThread(), getActivityToken(), service,
            service.resolveTypeIfNeeded(getContentResolver()),
            sd, flags, instanceName, getOpPackageName(), user.getIdentifier());

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
      public int bindIsolatedService(IApplicationThread caller, IBinder token, Intent service,...

             return mServices.bindServiceLocked(caller, token, service,
                     resolvedType, connection, flags, instanceName, callingPackage, userId);

/frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
  int bindServiceLocked(IApplicationThread caller, IBinder token, Intent service,...

//启动service

 bringUpServiceLocked(serviceRecord,...

 final Intent intent = new Intent(Intent.ACTION_REVIEW_PERMISSIONS);

mAm.mContext.startActivityAsUser(intent, new UserHandle(userId));

c.conn.connected(s.name, b.intent.binder, false);

requestServiceBindingLocked(s, b.intent, callerFg, false); //第一次绑定

private final boolean requestServiceBindingLocked(ServiceRecord r, IntentBindRecord i,...

 r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind,...

/frameworks/base/core/java/android/app/ActivityThread.java
 sendMessage(H.BIND_SERVICE, s)

 public void handleMessage(Message msg) {
  case BIND_SERVICE:
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");
    handleBindService((BindServiceData)msg.obj);
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

private void handleBindService(BindServiceData data) {
 Service s = mServices.get(data.token);
 if (DEBUG_SERVICE)
     Slog.v(TAG, "handleBindService s=" + s + " rebind=" + data.rebind);
 if (s != null) {
     try {
         data.intent.setExtrasClassLoader(s.getClassLoader());
         data.intent.prepareToEnterProcess();
         try {
             if (!data.rebind) {
                 IBinder binder = s.onBind(data.intent);  
                 ActivityManager.getService().publishService(
                         data.token, data.intent, binder);
             } else {
                 s.onRebind(data.intent);
                 ActivityManager.getService().serviceDoneExecuting(
                         data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0);
             }

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
  public void publishService(IBinder token, Intent intent, IBinder service) {

mServices.publishServiceLocked((ServiceRecord)token, intent, service);

 /frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
  void publishServiceLocked(ServiceRecord r, Intent intent, IBinder service)
    c.conn.connected(r.name, service, false);

 /frameworks/base/core/java/android/app/IServiceConnection.aidl
  oneway interface IServiceConnection {
     @UnsupportedAppUsage
     void connected(in ComponentName name, IBinder service, boolean dead);
 }

 /frameworks/base/core/java/android/app/LoadedApk.java
 static final class ServiceDispatcher {
         private final ServiceDispatcher.InnerConnection mIServiceConnection;
         @UnsupportedAppUsage
         private final ServiceConnection mConnection;

             public void connected(ComponentName name, IBinder service, boolean dead)
                     throws RemoteException {
                 LoadedApk.ServiceDispatcher sd = mDispatcher.get();
                 if (sd != null) {
                     sd.connected(name, service, dead);
                 }
             }
         }
 

public void connected(ComponentName name, IBinder service, boolean dead) {
          if (mActivityExecutor != null) {
              mActivityExecutor.execute(new RunConnection(name, service, 0, dead));
          } else if (mActivityThread != null) {
              mActivityThread.post(new RunConnection(name, service, 0, dead));
          } else {
              doConnected(name, service, dead);
          }
      }

 public void doConnected(ComponentName name, IBinder service, boolean dead) {
  // If there is a new viable service, it is now connected.
        if (service != null) {
            mConnection.onServiceConnected(name, service);
        } else {
            // The binding machinery worked, but the remote returned null from onBind().
            mConnection.onNullBinding(name);
        }
    }

startService bindService区别

startService
onCreate onStartCommand
多次调用startService,onCreate仅一次,onStartCommand多次

stopService
onDestroy

bindService
onCreate   onBind
多次调用bindService, onCreate   onBind仅一次

unBindService
onUnbind

参考

https://blog.csdn.net/qq_23452385/article/details/125867400

(4) Android中Binder调用流程 --- bindService的Binder流程介绍_会说话的小鱼的博客-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kv110/article/details/131407276

智能推荐

【实用篇】SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud分布式_springcloud + ribbitmq + docker + rebis-程序员宅基地

文章浏览阅读971次,点赞3次,收藏16次。配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则(针对某个服务的负载均衡策略)user-service: # 给某个微服务配置负载均衡规则,这里是user-service服务ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则1. Feign可以支持很多的自定义配置。_springcloud + ribbitmq + docker + rebis

pandas 统计数据频率函数value_counts及重复值和其他统计函数_pandas count_value-程序员宅基地

文章浏览阅读7.1k次。当统计一个数据集里数据出现的频率,次数可以使用value_countvalue_counts默认参数如下:value_counts(values, sort=True, ascending=False, normalize=False, bins=None, dropna=True)对于Series类型的数据data.value_counts()对于DataFrame类型的数据dat..._pandas count_value

R语言学习(三)——决策树分类_id3算法的数据包是哪个rpart-程序员宅基地

文章浏览阅读1.5w次,点赞11次,收藏94次。分类分类(Classification)任务就是通过学习获得一个目标函数(Target Function)f, 将每个属性集x映射到一个预先定义好的类标号y。分类任务的输入数据是记录的集合,每条记录也称为实例或者样例。用元组(X,y)表示,其中,X 是属性集合,y是一个特殊的属性,指出样例的类标号(也称为分类属性或者目标属性)。解决分类问题的一般方法分类技术是一种根据输入数据集建立分类模型..._id3算法的数据包是哪个rpart

LNMP(Nginx服务,MySQL 服务,安装PHP服务 手动安装技术文档)-程序员宅基地

文章浏览阅读64次。此文转载自:https://blog.csdn.net/weixin_51622156/article/details/112528435文章目录安装Nginx服务1、关闭防火墙将nginx所需软件包到/opt目录下2、安装依赖包3、 创建运行用户4、编译安装5.优化路径6、添加 Nginx 系统服务二、安装 MySQL 服务1、安装Mysql环境依赖包2、创建运行用户...

第6章函数-5 使用函数求余弦函数的近似值-程序员宅基地

文章浏览阅读1.1k次。本题要求实现一个函数,用下列公式求cos(x)近似值,精确到最后一项的绝对值小于eps(绝对值小于eps的项不要加):cos(x)=0!x0​−2!x2​+4!x4​−6!x6​+...函数接口定义:funcos(eps,x),其中用户传入的参数为eps和x;函数funcos应返回用给定公式计算出来,保留小数4位。输出样例:代码长度限制16 KB时间限制400 ms内存限制..._使用函数求余弦函数的近似值

STL源码剖析-关联式容器之hash_set、hash_map、hash_multiset和hash_multimap_stl源码hash_set-程序员宅基地

文章浏览阅读431次。一、hash_set1、hash_set以hashtable为底层机制,hash_set的操作几乎都是转调用hashtable的函数而已。2、hash_set的元素没有自动排序功能。3、hash_set的使用方式与set完全相同。4、测试例子 #include #include using namespace std;_stl源码hash_set

随便推点

2021-11-22 WinFrom面试题 如何在Form加载时,动态添加控件到Form中?_.net 怎么将自定义控件放到form中-程序员宅基地

文章浏览阅读3.2w次。这里以Label为例说明。在Form1的加载加载中:private void Form1_Load(object sender, EventArgs e){Label label1=new Label(){Text=“欢迎来到这里!!!”,ForeColor = System.Drawing.Color.Red,Name=”label1”,AutoSize=true,Location=new System.Drawing.Point(48, 37);};this.Controls.A_.net 怎么将自定义控件放到form中

Endnote使用——与WPS关联_endnotex8与wps-程序员宅基地

文章浏览阅读5.3w次,点赞39次,收藏79次。Endnote使用——与WPS关联1. 自动关联2. 手动关联我使用的是Endnote X8汉化版,在经历过反复重新安装包括关机重启之后,Endnote X8也没有自动和WPS关联,上网百度了很多办法,都没有用……过了很久,我终于弄好了。现记录一下过程。1. 自动关联我们需要下载安装最新版的WPS Office 2019,以及安装EndNote到电脑本地。这个时候,打开WPS文档,会发现菜单栏里已经有了EndNote X8的标识,说明软件已自动关联了。2. 手动关联如果软件下载或重新安装之后,未_endnotex8与wps

Mac息屏后如何保持网络连接,方便远程访问-程序员宅基地

文章浏览阅读7.7k次。1 wifi换成有线,因为息屏后WiFi就会自动断开2 设置修改,点亮唤醒网络不勾选,进入休眠不勾选3 目前测试用向日葵,远程这台电脑,再屏幕保护程序运行的情况下,可以远程控制。转载于:https://www.cnblogs.com/QuestionsZhang/p/11606815.html..._mac 休眠但是连得上

java/php/net/python基于微信小程序的课程表和成绩信息查询系统【2024年毕设】_校园课表小程序 csdn-程序员宅基地

文章浏览阅读156次。springboot基于Android平台的智能短途旅游规划APP。springboot基于微信小程序的中学历史学习系统。springboot图书馆自习室管理系统的设计与实现。springboot基于java的校园疫情管理系统。jsp基于MVVM的人力资源管理系统的设计与实现。ssm微信小程序的应急救护知识推荐的设计与实现。springboot基于Vue的寻人启事平台。ssm基于Android的体育场地的预订平台。ssm基于SSM的资产管理平台的设计与实现。springboot基于人流监控的景区系统。_校园课表小程序 csdn

Mybatis拦截器介绍及分页插件_分页拦截器什么时候触发-程序员宅基地

文章浏览阅读370次。Mybatis拦截器介绍及分页插件1.1 目录1.1 目录1.2 前言1.3 Interceptor接口1.4 注册拦截器1.5 Mybatis可拦截的方法1.6 利用拦截器进行分页1.2 前言 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻_分页拦截器什么时候触发

ADS-B消息的算法及仿真-程序员宅基地

文章浏览阅读3.7k次,点赞6次,收藏36次。为了进行ADS-B报文防欺骗技术研究,首先需要深入了解报文的编译码方法:译码的实现可以深度挖掘报文中的特征参数,进行防欺骗研究;编码的实现可以为后续仿真实验产生符合要求的报文打下基础。_ads-b