我正在为Android手机的客户端/服务器应用程序设计框架.我对Java和Android都很陌生(但对于一般的编程或特别是线程编程来说并不陌生).
有时我的服务器和客户端将处于相同的进程中,有时它们将处于不同的进程中,具体取决于具体的用例.客户端和服务器接口类似于以下内容:
IServer.aidl:
package com.my.application;
interface IServer {
/**
* Register client callback object
*/
void registerCallback( in IClient callbackObject );
/**
* Do something and report back
*/
void doSomething( in String what );
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
IClient.aidl:
package com.my.application;
oneway interface IClient {
/**
* Receive an answer
*/
void reportBack( in String answer );
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
现在这里有趣的地方.我可以预见客户端呼叫的用例,IServer.doSomething()
然后呼叫IClient.reportBack()
,并根据报告的内容,IClient.reportBack()
需要发出另一个呼叫IClient.doSomething()
.
这里的问题是,IServer.doSomething()
通常不会是可重入的.没关系,只要IClient.reportBack()
总是在新线程中调用.在这种情况下,我可以确保执行IServer.doSomething()
始终是synchronized
适当的,以便从新线程的调用阻塞,直到第一个调用返回. …
我有一个侦听套接字的服务.收到某些输入时,就是创建一个活动.当接收其他输入时,它将终止此活动.我已经挣扎了一段时间,通过AIDL(http://developer.android.com/guide/developing/tools/aidl.html)使服务与活动进行通信,但这似乎没有效果.我认为AIDL仅在要与之交谈的流程是服务时才有效,而不是在它是一项活动时?我想知道如何解决我的问题的一些方向或建议.
干杯,
我正在编写一个简单的音乐播放器,并且创建了一个播放服务,它实现了一个 AIDL 接口来与客户端绑定,一个是简单的曲目浏览器,另一个是更简单的播放器活动。该服务控制 MediaPlayer 对象,而两个活动使用 ServiceConnections 来获取与该服务的连接。
这包含在两个活动的 onStart() 方法中:
@Override
public void onStart()
{
super.onStart();
Intent i = new Intent(this, PureService.class);
startService(i);
bindService(i, mConnection, 0);
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了让服务不会在解绑后立即停止。当然,这实际上并不是问题,因为我的活动根本拒绝与服务解除绑定。每当我的应用程序在这些活动中执行 unbindService 时,unbindService 每次都会抛出 IllegalArgumentException,无一例外(呵呵)。
在 onStop 方法中:
@Override
public void onStop()
{
super.onStop();
if (mBound) {
try {
unbindService(mConnection);
} catch (java.lang.IllegalArgumentException e)
{
//Print to log or make toast that it failed
}
}
mBound = false;
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是:
提前致谢。
编辑:这是 …
AIDL是否支持短型?
http://developer.android.com/guide/developing/tools/aidl.html
它说"Java编程语言中的所有原始类型(例如int,long,char,boolean等)"
但似乎不能在AIDL中使用short.
谢谢 !
我想通过AIDL与客户端应用程序共享一个接口.我一直在编译时错误.代码片段是: -
interface ChildListener extends ParentListener {
public void onUpdate(Class1 c1);
}
Run Code Online (Sandbox Code Playgroud)
AIDL Set(全部在同一个包中) - >
ChildListener.aidl - 包含上面的代码.
Class1.aidl - 将Class1声明为parcelable.Class1的定义实现了parcelable.
ParentListener.aidl - 声明ParentListener.
错误 - >
我收到编译时错误(编译服务时)
1. syntax error don't know what to do with "extends"
2. syntax error don't know what to do with "ParentListener "
Run Code Online (Sandbox Code Playgroud)
看来我们不能在AIDL接口中使用继承?或者是我在这里遗漏了一些东西.任何指针将不胜感激.
最好的祝福
我发现这个答案的评论说明了一个图书馆项目:
好吧,这个评论是在大约一年半前做出的,我可以非常肯定地告诉你项目#2不再是真的(2010年9月?),因为我有一个完美的工作项目,由一个图书馆项目组成取决于另一个图书馆项目.
所以,我的问题是两个:
.aidl
文件?顺便说一下,作为一个实验,我试图将IMarketBillingService.aidl
(从应用程序内的计费样本中)放入一个库项目中(没有任何使用它的东西),并且该项目像以前一样构建和运行.因此,如果图书馆项目仍然无法包含a .aidl
,那么这必须更深入......
本着重用代码的精神,我正在尝试创建一些库项目。但是,我似乎在定义跨库的 .aidl 文件时遇到了问题。问题是这样的:
AI 库中有 Foo.java 和 Foo.aidl。Foo.java 是 Parcelable 所以 aidl 声明是:
Foo.aidl:
package com.example.library.A;
parcelable Foo;
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试创建库 B。在库 BI 中想要定义一个使用类 Foo 的服务接口:
IMyService.aidl:
package com.example.library.B;
import com.example.library.A.Foo;
interface IMyService {
void requestSomething(in Foo fooBug);
}
Run Code Online (Sandbox Code Playgroud)
该文件无法编译,并抱怨找不到 Foo 的导入。我尝试过引用库 A,并且尝试将库项目添加为外部 jar,但都不起作用。
是否存在我不知道的限制?我的项目设置有问题吗?
我可能应该提到,我已经在项目中直接使用了库 A,没有任何问题,所以我确信库 A 不是问题。
我有一个项目,包括多个gradle模块(插件com.android.library)相互引用(树,而不是平面).我强烈地使用AIDL,因此我在另一个模块(modB)的AIDL接口中引用来自一个模块(modA)的AIDL接口.
MODA/src目录/主/ AIDL/MODA/foo.aidl:
package modA;
interface foo {
void modAcall();
}
Run Code Online (Sandbox Code Playgroud)
商业方法/ src目录/主/ AIDL /商业方法/ bar.aidl:
package modB;
import modA.foo;
interface bar {
foo modBcall();
}
Run Code Online (Sandbox Code Playgroud)
商业方法/的build.gradle:
dependencies {
compile project(':modA')
}
Run Code Online (Sandbox Code Playgroud)
我可以在modB中的AIDL文件中引用modA的parcelables,我可以在modB中的java代码中引用modA的接口,但不能在modB中的AIDL中引用.而是couldn't find import for class
由aidl工具显示错误消息.
我注意到.aar文件也不包含库的aidl接口的信息,只列出了parcelables.我想这与上述问题的原因相同.
由于我已经将aidl文件放在一个地方,我不想将它们复制到另一个子项目,因为在这种情况下必须手动复制更改.我也不喜欢使用符号链接的想法,因为修改modB的src目录以包含来自modA的东西是错误的.
我正在尝试使用 aidls 构建一个库。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := $(call all-java-files-under, java) \
java/com/testapp/Istudent.aidl \
java/com/testapp/Itest.aidl \
LOCAL_PREBUILT_JAVA_LIBRARY := framework.jar
include $(BUILD_JAVA_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
我正在尝试推荐 Itest 中的学生。
学生助手
package com.testapp;
parcelable Istudent;
Run Code Online (Sandbox Code Playgroud)
学生.java
public class Istudent implements Parcelable{}
Run Code Online (Sandbox Code Playgroud)
测试帮助文件
package com.testapp;
import com.testapp.Istudent;
interface IAP2InterfaceBase {}
Run Code Online (Sandbox Code Playgroud)
但我收到的错误是 E 07-11 20:05:37 71066 71066 aidl.cpp:580] 拒绝从定义parcelable的aidl文件生成代码
请让我知道“拒绝从定义可打包的 aidl 文件生成代码”是什么意思?我在这里做错了什么..