标签: aidl

Android .aidl中的单向声明是否保证在单独的线程中调用该方法?

我正在为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适当的,以便从新线程的调用阻塞,直到第一个调用返回. …

java multithreading android aidl

7
推荐指数
1
解决办法
6221
查看次数

启动Activity与之通信的服务的最佳方式

我有一个侦听套接字的服务.收到某些输入时,就是创建一个活动.当接收其他输入时,它将终止此活动.我已经挣扎了一段时间,通过AIDL(http://developer.android.com/guide/developing/tools/aidl.html)使服务与活动进行通信,但这似乎没有效果.我认为AIDL仅在要与之交谈的流程是服务时才有效,而不是在它是一项活动时?我想知道如何解决我的问题的一些方向或建议.

干杯,

android aidl

6
推荐指数
1
解决办法
1770
查看次数

可以使用Messenger(AIDL的轻量级替代品)进行跨应用程序通信吗?

一个简单的问题:Android文档非常清楚地说明了MessengerAIDL for IPC(进程间通信)的替代方案.他们从未明确说过,这是否扩展到在不同应用程序中运行的进程,或仅在一个应用程序内.我强烈怀疑前者,但想检查一下.

谢谢!一月

android ipc aidl

6
推荐指数
1
解决办法
1556
查看次数

我什么时候应该使用 unbindService(),以及如何正确使用它来取消与使用 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)

我想知道的是:

  • 我应该在 onStop() 方法中调用 unbindService() 吗?或者根本没有?
  • 我的称呼正确吗?
  • 我启动/绑定服务的方式有什么我应该了解的特殊之处吗?
  • 我是否正在做一些完全错误的事情?我是 Android 编程新手,所以这当然不是不可能的。

提前致谢。

编辑:这是 …

java service android aidl

6
推荐指数
1
解决办法
8813
查看次数

Android AIDL支持"短"型?

AIDL是否支持短型?

http://developer.android.com/guide/developing/tools/aidl.html

它说"Java编程语言中的所有原始类型(例如int,long,char,boolean等)"

但似乎不能在AIDL中使用short.

谢谢 !

android aidl

6
推荐指数
1
解决办法
796
查看次数

是否可以在AIDL接口中使用继承?

我想通过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接口中使用继承?或者是我在这里遗漏了一些东西.任何指针将不胜感激.

最好的祝福

service inheritance android interface aidl

6
推荐指数
1
解决办法
3025
查看次数

为什么不能将.aidl放入库项目中?

我发现这个答案的评论说明了一个图书馆项目:

  1. 无法保存.aidl文件,
  2. 不能依赖另一个图书馆项目,
  3. 不能持有资产

好吧,这个评论是在大约一年半前做出的,我可以非常肯定地告诉你项目#2不再是真的(2010年9月?),因为我有一个完美的工作项目,由一个图书馆项目组成取决于另一个图书馆项目.

所以,我的问题是两个:

  1. 图书馆项目是否仍然无法保存.aidl文件?
  2. 如果#1的答案是肯定的,那么这是什么原因?

顺便说一下,作为一个实验,我试图将IMarketBillingService.aidl(从应用程序内的计费样本中)放入一个库项目中(没有任何使用它的东西),并且该项目像以前一样构建和运行.因此,如果图书馆项目仍然无法包含a .aidl,那么这必须更深入......

android aidl library-project

6
推荐指数
1
解决办法
2537
查看次数

无法跨库项目使用 .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 不是问题。

android aidl

6
推荐指数
1
解决办法
3209
查看次数

在Gradle中跨模块/子项目使用AIDL接口

我有一个项目,包括多个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的东西是错误的.

  • 有没有办法在aar中包含aidl接口,以便其他模块可以使用它?
  • 是否有可能在Gradle中扩展aidl include路径以使用依赖模块的aidl文件(对于子项目,它应该是可能的,因为aidl文件存在于文件系统上)而不再"再编译"它们(类的文件)生成的java接口/类已包含在aar/module导入中)?

android gradle aidl

6
推荐指数
1
解决办法
974
查看次数

Android:AIDL 拒绝从定义 Parcelable 的 aidl 文件生成代码

我正在尝试使用 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 文件生成代码”是什么意思?我在这里做错了什么..

android aidl

6
推荐指数
1
解决办法
1万
查看次数