首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Activity在通过aidl执行函数时挂起,即使该服务在另一个进程中,为什么?

Android Activity在通过aidl执行函数时挂起,即使该服务在另一个进程中的原因是因为aidl是基于Binder机制实现的,而Binder是Android中的一种跨进程通信(IPC)机制。当Activity通过aidl调用另一个进程中的服务时,实际上是通过Binder进行进程间通信。

在Android中,每个应用程序运行在一个独立的进程中,每个进程都有自己的主线程(UI线程)。当Activity调用另一个进程中的服务时,系统会将请求发送给服务所在进程的Binder驱动程序。然后,Binder驱动程序会将请求转发给服务进程中的Binder对象进行处理。

由于跨进程通信涉及到进程间的上下文切换和数据传输,因此会引入一定的开销和延迟。当Activity通过aidl调用另一个进程中的服务时,系统会将当前线程(通常是UI线程)挂起,等待服务进程处理完请求并返回结果。这就导致了Activity在执行aidl函数时挂起的现象。

这种挂起的情况在网络请求、耗时操作等场景下尤为明显。为了避免在主线程中执行耗时操作导致界面卡顿,Android推荐将耗时操作放在子线程中执行,或者使用异步任务(AsyncTask)等方式进行处理。

在腾讯云的产品中,与Android Activity通过aidl调用另一个进程中的服务相关的产品是腾讯云移动直播(Mobile Live)服务。该服务提供了一套完整的移动直播解决方案,包括推流、拉流、云端转码、云端录制等功能。您可以通过腾讯云移动直播产品介绍页面(https://cloud.tencent.com/product/mlvb)了解更多相关信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android常见问题及开发经验总结(四)

)里面又进行了是否为null的判断,这是因为一个线程进入了该代码,如果另一个线程在等待,这时候前一个线程创建了一个实例出来完毕后,另一个线程获得锁进入该同步代码,实例已经存在,没必要再次创建,因此这个判断是否是...AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言,设计这门语言的目的是为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信...AIDL服务。...这个问题 网上太多,但是好多都是同一篇文章  1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2、设置Activity...的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 3、设置Activity的android:configChanges

42830

Android AIDL跨进程通信

aidl跨进程通信的步骤: 1、创建aidl文件。 2、build后生成aidl对应的java文件。 3、创建服务端Service。...transact方法会发起RPC请求,同时当前线程挂起; 3、然后服务端中的stub类中的onTransact方法会被调用; 4、直到RPC过程结束,被挂起的线程继续执行,并从_reply中取出RPC...Binder对象转换成客户需要的AIDL对象,转换区分进程,客户端服务端位于同一进程,返回服务端的 //Stub对象本身;否则返回的是系统的封装后的Stub.proxy对象。...中注册该Service,并定义其所在的进程remote: android:name=".IRemoteService" android:process=":remote...:不是Service, 而是APDL中 IBinder 的实现类stub 和 Proxy,真正实现进程间通信 是通过 transact方法 和 onTransact方法。

59130
  • 【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )

    方法执行 8、调用 Service 中实现的 IMyAidlInterface.Stub 抽象方法 AIDL 跨进程通信完整流程梳理 ---- 1、AIDL 文件编译 AIDL 文件 IMyAidlInterface.aidl...远程服务 ; 这里涉及到跨进程调用 , 拿到的是一个代理 ; Stub 中定义了 asInterface 方法 , 该方法的作用是将 android.os.IBinder 对象转为 AIDL 接口对象...方法 ; 进入该方法后 , 会将原来的线程挂起 , 直到返回 , 原来的线程才会继续执行 , 这里非常容易出现 ANR ; /** * 远程对象的基类,由{@link IBinder}定义的轻量级远程过程调用机制的核心部分...* 例如,如果您在{@link android.app.Activity}中使用此函数, * 则您的活动的进程可能会在活动未启动时被终止; * 如果以后重新创建活动,则需要创建新的活页夹, * 并再次将其交回正确的位置...在 IMyAidlInterface.Stub.onTransact 方法中 , 通过方法对应的 ID 常量值匹配方法 , 在该方法中就会调用 IMyAidlInterface.Stub 中没有实现的抽象方法

    1.4K20

    《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式

    另外,在AIDL文件中需要明确标明引用到的数据类型所在的包名,即使两个文件处在同一个包名下。 下面通过Quiz示例来说明AIDL的使用方式。...Binder对象是一个可以跨进程引用的对象,它提供一组函数为客户端提供服务,其实体位于一个进程(Server)中。在客户端,可以通过Binder的引用来访问服务端。...客户端通过ServiceManager来获取服务端的服务列表。当调用服务器端的函数时,客户端直接调用Proxy。...Socket的getInputStream函数,返回该Socket对象对应的输入流,通过该输入流可以从Socket中取出服务端发送的数据。...如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象

    22610

    附详尽答案,新版精选Android中高级面试题--二

    ServiceManager(如同DNS域名服务器)服务的管理者,将Binder名字转换为Client中对该Binder的引用,使得Client可以通过Binder名字获得Server中Binder实体的引用...参考回答:AIDL(Android Interface Definition Language,Android接口定义语言):如果在一个进程中要调用另一个进程中对象的方法,可使用AIDL生成可序列化的参数...onTransact():运行服务端的Binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由此方法来处理。...transact():运行在客户端,当客户端发起远程请求的同时将当前线程挂起。之后调用服务端的onTransact()直到远程请求返回,当前线程才继续执行。...该方法只在ViewGroup中有,View(不包含 ViewGroup)是没有的。一旦拦截,则执行ViewGroup的onTouchEvent,在ViewGroup中处理事件,而不接着分发给View。

    1.1K20

    Android Service 服务(三)—— bindService与remoteService

    可能用户在播放过程中要执行一些操作比如获取歌曲的一些信息,此时activity可以通过调用bindServices()方法与Service建立连接。...()函数) 4、 Activity中,通过返回的Service实例musicService,执行音乐播放的操作(play、pause、stop等) 六、Remote Service拓展 通常每个应用程序都在它自己的进程内运行...AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。...如果你需要在一个进程中(例如在一个Activity中)访问另一个进程中(例如一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。...Stub类,Service来继承该Stub类 4、 Activity中,通过操作Service实例(musicService),执行音乐播放操作(play、pause、stop等) 源码下载 参考推荐:

    2.3K30

    Android四大组件全面解析,夯实基础。

    AIDL :用于生成可以在Android设备上两个进程之间进行IPC的代码。...如果在一个进程中(比如Activity)要调用另一个进程中(比如Serveice)对象的操作,就可以使用AIDL生成可序列化的参数。 关于AIDL 及 IPC本篇不会过多涉及。...由于是独立进程,因此在Activity所在进程被kill时,该服务依然运行,不受影响。,>,> 但需要注意的是:因为该服务是独立进程,会占用一定资源,并且使用 AIDL 进行 IPC会稍微麻烦。...远程服务 步骤1:新建定义AIDL文件,并该声明服务需要向客户端的提供的接口 步骤2:在服务子类中实现AIDL中定义的接口方法,并定义生命周期的方法(onCreat,onBind(),blabla)...当 BroadcastReceiver 在 10 秒内没有执行完毕,Android 会认为该程序无响应。

    90230

    我也想聊聊Binder机制

    2 序列化 日常开发中,通过Intent携带数据跳转Activity时,数据通常要通过实现Serializable或Parcelable接口,才能在被Intent所携带,而Serializable接口和...3 AIDL 在Java层,想利用Binder进行夸进程的通信,那就得通过AIDL(Android 接口定义语言)了,AIDL是客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口...,只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL,如果是在单应用(单进程),建议使用Messager。...3.4 小结 客户端调用服务的方法,被调用的方法运行在服务端的的Binder线程池,同时客户端会被挂起,如果服务端方法执行耗时操作,就会导致客户端ANR,所以不要在客户端主线程访问远程服务方法。...这就是在AIDL中,为什么在onTransact()函数中处理响应数据。

    80820

    Android 进阶7:进程通信之 AIDL 的使用

    我们可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。 在 Android 上,一个进程通常无法访问另一个进程的内存。...尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。 编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。...通过这种机制,我们只需要写好 aidl 接口文件,编译时系统会帮我们生成 Binder 接口。...2.编写服务端代码 创建 Service,在其中创建上面生成的 Binder 对象实例,实现接口定义的方法;然后在 onBind() 中返回 创建将来要运行在另一个进程的 Service,在其中实现了...onServiceDisconnected(ComponentName name) { mAidl = null; } }; 在 Activity 中创建一个服务连接对象,在其中调用

    1.1K80

    Android之Service学习笔记

    前言 本来想学习学习Binder通信机制,在学习的过程中又接触AIDL并开始学习,在AIDL学习过程中看到bindService,接着就想回顾一下Service的一些知识。...启动: 当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。...绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。...onCreate() 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 [onStartCommand()](https://developer.android.com/reference...如果服务已在运行,则不会调用此方法。 onStartCommand() 当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。

    83200

    浅析Binder机制

    binder就是Android中实现进程间通信的一种架构。...这里首先有个基本的概念:进程间的通信。在进程A里面用service.invoke(func),真正的执行主体是在进程B。 第一个基础问题,为什么要用cs结构?为什么要用IPC通信?...在安卓系统中client和server的概念还是挺明确的,用户程序常常要使用一些通用的系统服务,gps,alarm,包括开一个activity,task栈是可以跨进程的,维护这个栈也需要系统去维护。...总结 我理解的binder架构简单来说就是通过借助一套通信机制与关键的中间进程,把函数调用信息发送给远程进程进行执来实现Android系统中高效安全的进程间通信。...手写Binder 教你理解android中的进程间通信

    1.2K100

    android基础部分再学习---再谈Service进程服务通信

    这样,activity就可以启动服务来播放音乐,并且音乐会一直播放下去,即使用户离开该应用程序也没关系,这个activity可以绑定播放服务来重新获得播放控制权。...但是Android系统在创建客户端与服务之间的联接时,会调用 ServiceConnection 中的onServiceConnected() 方法,传递一个 IBinder ,客户端将用它与服务进行通信...服务和客户端也必须位于同一个进程中,因为这种方式不能执行任何跨进程的序列化(marshalling)操作。...onServiceDisconnected()当与服务的联接发生意外中断时,比如服务崩溃或者被杀死时,Android系统将会调用该方法。客户端解除绑定时, 不会调用该方法。...请注意这表明你的activity在整个运行期间都需要使用服务(即使在后台),因此假如服务位于其它进程中,则你会增加进程的重量级,进程也会更容易被系统杀死。

    76230

    Android十八章:从Android看Binder

    Binder介绍 Binder是android上的一个类 继承了IBinder,用作Ipc进程间通讯,同是帮助Serivermanager连接各种manager(activitymanager,windowmanager...客户端和服务端通信时,客户端bindservice,服务器发送给客户端binder对象,客户端拿到binder可以得到服务端数据。...同一进程这里处理方法的调用 内部类Stub 在stub内部类还有一个内部类proxy 实现了IBookmanager,其中声明了一个binder变量,在proxy构造函数赋值,并在asBinder方法返回这个...期间,调用了binder的transact方法来执行远程调用。 另一个addBook方法也是同理。...客户端是一个activity,onbind绑定到服务端服务,在ServiceConnection类的连接成功方法,把返回的binder转为Imanager类。 调用get方法获取服务端内容。

    55420

    2016级移动应用开发在线测试12-service

    首先用AIDL语言定义跨进程服务的接口,然后继承Service类实现跨进程服务,绑定和使用跨进程服务,就可以将数据打包进行进程间通讯了 ()在Android中能开机自启动的那些才是Service,无法开机自启动的就不是...()Service比Activity有个更高的优先级(在系统中永远运行的组件)。在系统资源紧张时,Service不会轻易被Android系统终止。...该方法在onStartCommand()或onBind()方法之前调用 ()onBind():这是一个必须实现的方法。当一个组件想通过bindService()方法绑定服务时,该方法将会被系统调用。...()onDestory():当服务不再使用或这在被销毁时,该方法将被系统调用。在个方法中,实现对线程,监听器等资源的清理或者释放。 5. 下面对于android服务叙述错误的是。...()远程服务(Remote Service)独立寄存于另一进程中,通过AIDL(Android Interface Definition Language)接口 定义语言,实现Android设备上的两个进程间通信

    51020

    【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )

    , 即跨进程远程服务时 , 才会使用这个类 ; private static class Proxy implements kim.hsl.aidl_demo.IMyAidlInterface 在代理类中也需要...sDefaultImpl; } Binder 的 transact 方法 ; 进入该方法后 , 会将原来的线程挂起 , 直到返回 , 原来的线程才会继续执行 , 这里非常容易出现 ANR ;...}) * 的上下文中执行此操作,该组件应保持运行。...* 例如,如果您在{@link android.app.Activity}中使用此函数, * 则您的活动的进程可能会在活动未启动时被终止; * 如果以后重新创建活动,则需要创建新的活页夹, * 并再次将其交回正确的位置...在远程端,transact调用绑定器来执行IPC。

    1.8K30

    跨进程通信(socket,binder,handler),Binder ,linkToDeathAIDL,Bundle,使用Socket

    主线程执行大量的耗时操作容易导致ANR现象发生。5s,广播10s (3)在Android中最有特色的进程间通信方式就是Binder了,通过Binder可以轻松地实现进程间通信。...二、Android中的多进程模式 1、在Android中使用多进程只有一种方法: 就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidManifest...从IPC角度来说,Binder是Android中的一种跨进程通信方式, Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在linux中没有; 从Android...Binder一个很重要的作用是:将客户端的请求参数通过Parcel包装后传到远程服务端,远程服务端解析数据并执行对应的操作,同时客户端线程挂起,当服务端方法执行完毕后,再将返回结果写入到另外一个Parcel..." android:process=":remote" /> 可以看到2个进程 客户端的话就简单在activity中通过bindService方法绑定服务端

    25310

    android基础部分再学习--AIDL

    AIDL与其他IDL语言类似,你需要做一些工作。 它允许你定义客户端与服务端达成一致的程序接口使用进程间通信相互交流。 在ANdroid上面,一个进程不能正常的访问另一个进程的内存。...情形与依赖调用是来自一个本地进程中的线程还是一个远程进程中的线程相关 尤其是: 来自本地进程的调用与调用者在同一个线程中执行。...如果这是你的主UI线程,线程继续在AIDL接口中执行 如果是其他的线程,则它是一个在service中执行你的代码的线程 这样,如果只是本地线程访问这个service,你完全可以控制哪些线程在其中执行(但是如果是那样的话...RemoteService.java 跨进程传递对象 ---- 如果你想通过IPC接口把一个类从一个进程传递到另一个进程中,那么是可以的。...aidl再看一下AIDLService调用实现代码 --1.在服务端实现AIDLService.Stub抽象类,在服务端onBind方法中返回该实现类 --2.客户端绑定service时在ServiceConnection.onServiceConnected

    54720

    Android进程间通信(四):进程间通信的方式之AIDL

    然后前面提到是在服务端的 Binder 线程池中执行的,所以会存在多个线程同时访问的情况。...因为对象是不能直接跨进程传输的,对象传输的本质都是反序列化的过程,这就是为什么 AIDL 中的对象都得实现 Parcelabe 接口的原因。 那我们怎么才能解注册呢?...至此,AIDL 的基本使用方法已经介绍完了,但是还有几点需要再强调以下: 客户端调用远程服务的方法是运行在服务端的 Binder 线程池中的,客户端会被挂起直到方法执行完成,如果方法比较耗时的话,客户端如果在...这里介绍两种方法: 1.在 obBinder 中验证 验证不通过时直接返回 null,这样验证失败的客户端直接无法绑定服务。... 2.在服务端的 onTransact 中验证 在 onTransact 中验证失败即返回 false,这样服务端就终止执行AIDL中的方法从而达到保护服务端的效果。

    1.3K20

    Android12 应用启动流程分析

    是个虚函数,Activity 本身也是 Context 的子类,也实现了该方法。...关键调用路径: exexute: 处理 Activity 启动请求的接口; executeRequest: 执行一系列权限检查,对于合法的请求才继续; startActivityUnchecked: 调用该方法时表示大部分初步的权限检查已经完成...,执行 Trace,以及异常处理; startActivityInner: 启动 Activity,并更新全局的 task 栈帧信息; 在 Android 中系统维护了所有应用的状态信息,因此用户才可以在不同应用中无缝切换和返回...其中通过异步的 Handler 分发和调度事件,最终在 执行线程(主线程)的 handleMessage 回调中执行服务端传过来的 Transaction。...Application 启动之前初始化,而且在应用启动之前还设置了系统的的 HTTP 代理,这也是为什么在 Android 中 native 进程不使用系统代理,因为对于代理是在 ActivityThread

    1.3K20

    android进程间通信方式有哪几种_安卓进程间通信

    ,不同进程间不能之间操作对方的数据,这叫做“进程隔离” 只有允许不同应用的客户端用 IPC 方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用 AIDL 如果需要调用远程方法,但不需要处理并发...在一个进程中启动了另一个进程的 Activity,Service 和 Receiver ,可以在Bundle 中附加要传递的数据通过 Intent 发送出去。...可以在一个进程中序列化一个对象到文件系统中,在另一个进程中反序列化恢复这个对象(注意:并不是同一个对象,只是内容相同) SharedPreferences 是个特例,系统对它的读 / 写有一定的缓存策略...Messenger Messenger是一种轻量级的 IPC 方案,它的底层实现是 AIDL ,可以在不同进程中传递 Message 对象,它一次只处理一个请求,在服务端不需要考虑线程同步的问题,服务端不存在并发执行的情形...*buf, size_t len, int flags);//IO读函数 int close(int fd); //关闭函数 当我们使用socket来进行进程间的通信时,实际是通过将IP设置为127.0.0.1

    1.9K10
    领券