首页
学习
活动
专区
工具
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、不设置Activityandroid:configChanges,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2、设置Activity...的android:configChanges="orientation",切屏还是会重新调用各个生命周期,切横、竖屏只会执行一次 3、设置Activityandroid:configChanges

39130

详解Android进程IPC通信AIDL机制原理

简介 AIDL:Android Interface Definition Language,即Android接口定义语言,用于生成Android不同进程间进行进程通信(IPC)的代码,一般情况下一个进程是无法访问另一个进程的内存的...Android进程操作的方式不止一种,四大组件ContentProvider天生就是为跨进程操作而存在的,但是ContentProvider所谓的跨进程操作数据,这些数据不一定是存放在内存的,...通过调用生成的AIDL接口实例对应的方法就可以实现IPC调用了; 不使用的时候解除服务的绑定Context.unbindService()。...但是实际上客户端调用服务端的远程方法,被调用的方法运行在服务端的Binder线程池中的,同时客户端线程会被挂起,这时候如果服务端方法执行比较耗时,就会导致客户端长时间阻塞在这里,如果客户端方法位于UI线程...实际开发的时候注意,客户端进行IPC通信的时候尽量放在子线程。由于服务端的方法本身就是运行在服务端的Binder线程池中,所以即使服务端需要执行大量耗时的工作也不需要开启新的线程去执行

1.5K30

【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.2K20

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: <service android:name=".IRemoteService" android:process=":remote...:不是Service, 而是APDL IBinder 的实现类stub 和 Proxy,真正实现进程间通信 是通过 transact方法 和 onTransact方法。

54230

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

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

14210

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等) 源码下载 参考推荐:

2K30

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

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

1.1K20

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

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

81330

我也想聊聊Binder机制

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

77120

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

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

1K80

Android之Service学习笔记

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

79600

浅析Binder机制

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

1.1K100

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

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

48320

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

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

67830

【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.6K30

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方法获取服务端内容。

52220

android基础部分再学习--AIDL

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

50720

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

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

1.2K20

Android12 应用启动流程分析

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

1.2K20
领券