Articles of aidl

如何使用SDK示例代码从命令行使用AIDL工具?

我的问题是从命令行使用aidl.exe(在Windows系统上)。 这个问题与Eclipse,Netbeans等无关。 Android SDK包含以下三个AIDL定义文件: IRemoteService.aidl IRemoteServiceCallback.aidl ISecondary.aidl 位于以下目录中: C:\ Android的SDK-WINDOWS \平台\ Android的2.1 \样本\ ApiDemos的\ src \ COM \例子\机器人\的API \应用 为简单起见,我将aidl.exe复制到上面的目录中。 然后,从控制台窗口,我成功使用以下两个命令来生成.java文件: C:\ Android-project \ ApiDemos \ src \ com \ example \ android \ apis \ app> aidl IRemoteServiceCallback.aidl C:\ Android-project \ ApiDemos \ src \ com \ example \ android \ apis \ app> […]

如何在库中为多个应用程序运行单件(共享)服务?

我写了一个在后台启动服务的库。 它在所有应用程序中运行完美。 为了减少RAM的使用,我想避免为不同的应用程序运行多个服务。 实际上,只使用一种服务来完成任务就足够了。 首先,我编写了一个AIDL文件,用于在应用程序/库之间建立IPC。 使用签名权限将服务定义为导出/启用。 由于所有应用程序都是完全相同的服务,因此无法检查是否有任何应用程序启动或关闭。 绑定服务以检查服务的状态时,由于BIND_AUTO_CREATE标志的性质,它总是创建并销毁自己的服务。 这就是为什么不能从导出的服务获得任何types的信息,如果它真的启动并运行。 然后,我尝试将内容提供程序定义到库的清单中。 我的目标是通过它分享服务信息。 在导出的服务和应用程序主进程之间进行通信是非常好的机制。 但它不适用于多个实例。 因为从库中获取内容提供者信息的应用程序使用相同的权限,因此无法安装第二个。 它给出了DUPLICATE_PROVIDER_AUTHORITY错误。 你对这个问题有什么建议? 有没有选项来创建主/从机制? 是否可以使应用程序的服务单例使用库项目? PS:尝试广播和共享偏好技术。 但是他们无法从导出的服务中收听回调。

何时使用基于援助的服务?

在什么情况下使用AIDL定义服务接口是正确的决定(而不仅仅是创建service类的扩展)?

Android – 在活动中使用服务中的方法?

我的appplication中的服务中有以下方法: public void switchSpeaker(boolean speakerFlag){ if(speakerFlag){ audio_service.setSpeakerphoneOn(false); } else{ audio_service.setSpeakerphoneOn(true); } } 所以我的问题是能够在如下的Activity中使用此方法的最佳和最有效的方法 final Button speaker_Button = (Button) findViewById(R.id.widget36); speaker_Button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ switchSpeaker(true); //method from Service } }); 我必须做AIDL还是有更简单的方法?

RxJava和缓存数据

我还是RxJava的新手,我在Android应用程序中使用它。 我已经阅读了一个关于这个主题的公吨,但仍然觉得我错过了一些东西。 我有以下情况: 我有数据存储在系统中,通过各种服务连接(AIDL)访问,我需要从该系统检索数据(可能发生1-n次异步调用)。 Rx帮助我简化了这段代码。 但是,整个过程往往需要几秒钟(超过5秒+)因此我需要缓存此数据以加速本机应用程序。 此时的要求是: 初始订阅时,缓存将为空,因此我们必须等待所需的加载时间。 没什么大不了。 之后,应该缓存数据。 后续加载应该从缓存中提取数据,但是应该重新加载数据并且磁盘缓存应该在幕后。 问题:我有两个Observable – A和B. A包含从本地服务中提取数据的嵌套Observable(这里有吨)。 B更简单。 B只包含从磁盘缓存中提取数据的代码。 需要解决:a)返回缓存项(如果已缓存)并继续重新加载磁盘缓存。 b)缓存为空,从系统加载数据,缓存并返回。 后续调用将返回“a”。 我有几个人推荐一些操作,如flatmap,merge甚至主题,但由于某种原因,我无法连接点。 我怎样才能做到这一点?

共享库项目的清单服务和权限

我想开发一个由GCMIntentService组成的库项目,它执行GCM注册过程并接收通过GCM发送的消息。 我已经使用AIDL将我的库项目服务暴露给宿主应用程序,但我还需要在应用程序项目中声明服务…..我怎样才能避免这种情况? 此外,我还需要在应用程序清单中声明GCM所需的所有权限。 是否有任何方法可以从主机应用程序中引用库项目的所有权限和服务,而无需在清单中再次声明它们? 我搜索过这个并发现: 1. 是否可以在Android框架(库)中封装权限 这清楚地表明我想要实现的目标是不可能的。 2.有用的库项目清单文件是否合并? @Hayes Haugen的回答说“在ADT工具的第20版中支持AndroidManifest.xml合并” 我正在使用ADT版本20.0.3 无论如何我可以实现提供GCM集成的库项目吗?

Android RemoteExceptions和服务

所以我为Android操作系统编写了一个服务和一个活动。 我的服务在它自己的进程中运行,因此我的活动和服务之间的所有通信都通过IPC进行。 我使用标准的Android .aidl机制。 到目前为止一切正常。 但是,AIDL使用“throws RemoteException”生成所有方法存根,因此我必须处理它们。 我对整个Android源代码做了一个快速的grep,并且只发现了三个抛出此exception的情况。 这些是我不联系的不同服务。 我也检查了C源代码,因为理论上可以使用JNI接口生成RemoteExceptions。没有出现任何问题。 我的印象是每个人都像这样处理它们: try { mService.someMethodCall (someArguments); } catch (RemoteException e) { e.printStackTrace(); } 这不是可靠的代码,我不想在我的代码库中使用这样的东西。 除此之外:我试图通过IPC自己抛出一个RemoteException,我得到的只是一个堆栈跟踪和系统日志消息,告诉我还没有支持exception。 我的应用程序从未见过exception,抛出exception的服务最终处于一个非常奇怪的状态(半途工作):-( 问题是: 是否会抛出这些exception? 有没有人见过这样的try-catch块捕获RemoteException? 可能是因为它们不存在而且我们只是被迫处理它们,因为“抛出RemoteException”是死代码还是AIDL编译器内部的遗留问题? 免责声明:我还没有阅读完整的源代码。 我使用Grep来查找RemoteException的出现,所以我可能因为不同的空格使用而错过了一些。

为什么ITelephony.aidl有效?

我看到一些SOpost讨论了如何以程序方式结束电话,例如, 这个 。 是的,人们专注于结果,但没有人真正解释它为什么起作用的原因? 我尝试了代码,效果很好。 但是我想了解更多关于底下发生的事情的细节? 为什么通过创建ITelephony.aidl ,我们的项目中暴露了android隐藏的内部ITelephony接口? 我们自己如何创建ITelephony.aidl和自动生成的java(/gen/ITelephony.java) 链接到 android的ITelephony界面? 是否只是因为名称匹配(包名和援助文件名)? TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); Class c = Class.forName(tm.getClass().getName()); Method m = c.getDeclaredMethod(“getITelephony”); m.setAccessible(true); //Why does the android internal ITelephony interface is exposed after created the ITelephony.aidl? com.android.internal.telephony.ITelephony telephonyService = (ITelephony) m.invoke(tm); telephonyService.endCall();

GREF在multithreading服务中增加/减less(aidl) – 这意味着什么?

我有一个android活动和使用aidl实现的服务。 就像一个冠军,我有一个callback设置传递一些线程通知回到用户界面,似乎工作正常,除了很多 GREF已增至101,201,301,401,501等,而GREF则下降。 我做了一些在线search,发现它必须做全球参考。 08-17 02:31:19.735: DEBUG/dalvikvm(2558): GREF has increased to 301 … 08-17 02:31:25.823: DEBUG/dalvikvm(2558): GREF has increased to 401 … 08-17 02:31:36.772: DEBUG/dalvikvm(2558): GREF has increased to 501 … 08-17 02:31:42.694: DEBUG/dalvikvm(2558): GREF has increased to 601 … 08-17 02:31:48.695: DEBUG/dalvikvm(2558): GREF has increased to 701 … 08-17 02:31:59.883: DEBUG/dalvikvm(2558): GREF has decreased […]

pipe理远程服务callback

我有一种情况,我觉得我要重新发明轮子,或者绕着房子去处理那些已经有了“devise”的东西,所以在我之前,我希望能够得到第二个意见。 。 我有一个远程服务。 由于应用程序本身的exception性质/function,它是一个永久的前台服务。 我正在编写一个库,以便第三方应用程序可以绑定到服务,并使用我公开的API。 由于我自己处理线程,并且大多数callback将是asynchronous的,所以我使用了AIDL方法,并使用“Parceled”自定义类为服务提供必要的参数。 到目前为止,一切正常, 我的服务代码的构造与RemoteService API示例非常相似,所以我将引用这一点,因为发布特定的代码不会改变问题。 就像这个例子一样 ,我将每个请求的接口保存到一个RemoteCallbackList中 ,这似乎是一些其他基础知识的方便的解决scheme。 但是,我的服务并不提供相同的信息给一组“等待接收者”,因为使用下面的代码片段表明: int i = callbacks.beginBroadcast(); while (i > 0) { i–; try { callbacks.getBroadcastItem(i).somethingHappened(); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } callbacks.finishBroadcast(); 相反,这些请求有许多不同的types,因此我需要跟踪哪个确切的接口对象我要发回结果。 每个单独的请求可能涉及进一步的asynchronousWeb请求和/或处理,并且必须将callback对象交给每个(通过构造函数或只是一个方法参数)是我感觉我要做一些非常乏味的事情,啰嗦解决一个问题,我可以简单地实现另一种方式? 如果我可以保证第一个请求是第一个结果,那么这个任务将会变得简单,因此在删除对它们的引用之前就简单地使用RemoteCallbackList中的顺序,但事实并非如此,因为处理时间不同不同的请求types。 编辑 – 看起来RemoteCallbackList是由一个ArrayMap支持,所以我认为不是有序吗? 我可以find没有logging的方式来缩小RemoteCallbackList中的callback起源,虽然即使我可以,我当然仍然需要某种持久的标识符来知道我在找什么…. […]