Articles of 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起源,虽然即使我可以,我当然仍然需要某种持久的标识符来知道我在找什么…. […]

maven build android项目:指定aidl文件的位置

我的android项目只有aidl文件,项目结构如下图所示: MyProject/ src/ main/ com.my.aidl/ IMyService.aidl pom.xml 我正在用maven构build我的android项目。 我的pom使用了dexguard-maven-plugin ,它是android-maven-plugin的扩展。 在插件configuration中,我明确指定了source aidl文件的目录和生成的java文件的目录。 <build> <plugins> <plugin> <groupId>com.saikoa.dexguard.maven</groupId> <artifactId>dexguard-maven-plugin</artifactId> <configuration> <aidlSourceDirectory> ${project.basedir}/src/main/com/my/aidl </aidlSourceDirectory> <genDirectoryAidl> ${project.build.directory}/generated-sources/aidl/main/com/my/aidl </genDirectoryAidl> </configuration> <extensions>true</extensions> </plugin> </plugins> </build> 但是,我运行mvn clean install -e我得到了以下错误跟踪: [ERROR] Failed to execute goal com.saikoa.dexguard.maven:dexguard-maven-plugin:6.1.18:generate-sources (default-generate-sources) on project MyProject: Execution default-generate-sources of goal com.saikoa.dexguard.maven:dexguard-maven-plugin:6.1.18:generate-sources failed. NullPointerException -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed […]

Android Aidl编译错误:无法find类的导入

( 我知道有关于stackoverflow和其他地方(如谷歌组)有关添加可交付NetworkInfo的多个问题,但这不是关于这一点。 ) 我的工作在$(AOSP_ROOT)/ device /下,涉及多个aidl文件。 其中之一就是, package com.example; parcelable SomeRequest; 另一个援助就是, package com.example; import com.example.SomeRequest; interface SomeService { SomeRequest getRequest(); } 我会得到编译错误, device/somedevice/sdk/libs/aidl/com/example/SomeService.aidl:9: couldn't find import for class com.example.SomeRequest 我想知道这是处理aidl文件的顺序。 我的Android.mk看起来像, LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, aidl) LOCAL_AIDL_INCLUDES := $(call all-Iaidl-files-under, aidl) 这个构build错误是在我将aidl文件从src /文件夹移动到aidl /文件夹(出于某种原因我必须这么做)之后引入的。 它工作之前,但现在即使我把它移回到src /文件夹,它不再工作。 我试图清理$(AOSP_ROOT)/ out / device / […]

如何做一个内部类Parcelable

我需要知道如何创build一个内部类Parcelable,以便它的types的对象可以通过AIDL传递给远程服务。 我找不到任何有关这方面的信息。 下面是我正在尝试完成的示例代码,但是它不能编译,因为Bar类中的CREATOR不能是静态的(即因为它在内部类中)。 我不能让Bar成为一个静态的内部类,我不能把Bar移到Foo类之外(系统中的其他依赖)。 我也需要知道如何从AIDL文件中引用Bar类。 任何帮助是极大的赞赏。 public class Foo implements Parcelable { private int a; public Foo() { } public Foo(Parcel source) { this.a = source.readInt(); } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.a); } public static final Parcelable.Creator<Foo> CREATOR = new Parcelable.Creator<Foo>() { … } public […]

Android远程服务callback

(我有一个远程服务,有一个AIDL接口,由几个客户端应用程序使用,我想添加一个asynchronous方法到接口,需要一些时间的调用,但我需要的解决scheme是安全的 ,这意味着只有我的应用程序可以与服务进行通信,客户端应用程序的签名与服务应用程序的签名相同,目前应用程序只是绑定到服务上,调用单一的接口方法来执行各种操作。 一种select是在操作完成时在服务中广播一个Intent,并在客户端应用程序中使用BroadcastReceiver,但是( 问题#1 )可以确保只有我的应用程序能够接收Intent? setPackage()似乎这样做,但我需要支持姜饼设备,这似乎排除根据这里的答案: setPackage姜饼意图 所以看来我需要添加第二个.aidl接口与服务的callback接口使用,由客户端实现。 我已经看到了在这里使用监听器的例子,但我不确定与仅仅传入第二个接口对象作为参数的客户端有什么不同(在IScript / IScriptResult例子中用到了这个答案: 服务调用回到活动android ) 问题2 ,在这里使用监听器和callback方法有什么好处?