2

谷歌文档有一个关于如何制作 AIDL 服务的教程。但是,当我尝试执行相同操作时,出现错误“IRemoteInterface 类型的方法 registerCallback(IRemoteInterface) 未定义。

我在谷歌搜索的任何教程中都没有看到这个“registerCallback”方法,我的问题是为什么这不起作用/为什么其他地方不使用它?

我觉得我的问题的一部分是对服务及其“回调”的根本误解,以将信息发送到与之绑定的对象。谢谢!

爱迪尔:

package com.mine.ben;

import com.mine.servicenexus.RelPoint;


interface IRemoteInterface {

    Location getLastLocation();
    RelPoint getRelPoint();
    int logControlActivity(in String text,in int severity);
    int getRunningStatus();
}

更新的问题:当我添加时,我的 AIDL 文件中出现语法错误

void registerCallback(IRemoteServiceCallback);
void unregisterCallback(IRemoteServiceCallback);

我已经清理了我的工作区,它会自动构建。这是gen文件的问题吗?

4

4 回答 4

2

我的应用程序中的几行:

interface IGpsService {
    Bundle getNavigationMessage();
    void resetStatistics();
    void recordingEnable(boolean recordingEnabled, boolean continueLastTrack);
    void registerCallback(IGpsChanged cb);
    void unregisterCallback(IGpsChanged cb);
    boolean isRecordingEnabled();
    void setGhost(int trackId);
    void startGhost();
    void sendUserEvent(int eventId);
}

回调接口本身的第二个文件:

interface IGpsChanged{
oneway void onLocationChanged(out Bundle message);
}

最重要的是 -通常您不需要那些 .aidl 定义。仅当在应用程序之外公开服务方法时才需要这样做。

了解它的工作原理也很有帮助——forstaidl 定义了基本服务的方法。registerCallback 不是一个“特殊”方法,它和其他任何方法一样普通,只是允许为双向通信定义回调(在这种特殊情况下 - 将一些位置信息从服务发送到绑定活动(或其他组件)。

正如您在评论中提到的 - 您不想创建服务,只需从应用程序外部使用一些服务。在这种情况下,您需要那些外部辅助文件,而不是您编写的文件。使用服务方法的存根将在 /gen 目录中生成。

于 2013-07-25T19:30:20.767 回答
2

谷歌文档有一个关于如何制作 AIDL 服务的教程。

那不是教程。这只是普通的文档。

但是,当我尝试执行相同操作时,出现错误“IRemoteInterface 类型的方法 registerCallback(IRemoteInterface) 未定义。

那是因为您没有registerCallback()在 AIDL 中命名的方法。

我在任何教程中都没有看到这个“registerCallback”方法

它不在教程中。registerCallback()您链接到的网页中唯一出现的是“一些演示调用 AIDL 创建的服务的示例代码,取自 ApiDemos 项目中的远程服务示例”。如果您选择从 SDK 管理器下载示例代码,则 ApiDemos 项目位于您的 SDK 安装中。

于 2013-07-25T19:25:54.497 回答
2

您引用的 AIDL 指南中的代码示例取自ApiDemos 项目中的远程服务示例。registerCallback()通过使用 android.os.RemoteCallbackList<E extends android.os.IInterface>对象来实现。

于 2014-04-18T12:41:05.383 回答
0

制作一个 .aidl 文件,如:

package com.example;

oneway interface IRemoteServiceCallback {
    /**
     * Goes to client.
     */
    void valueChanged(int value);
}

创建另一个 .aidl 文件,在其中导入此接口并将其用作方法的参数,例如:

package com.example;

import com.example.IRemoteServiceCallback;

interface IRemoteService {
    /**
     * Goes to service.
     */
    void registerCallback(IRemoteServiceCallback cb);
}
  • 从两边的 .aidl 生成代码。
  • 在服务中实现IRemoteService.Stub并在onBind()中返回
  • 在客户端实现IRemoteServiceCallback.Stub并在ServiceConnectiononServiceConnected()回调中将其传递给从IRemoteService.Stub.asInterface()的IRemoteService实例接收。

现在您的服务可以通过传递的IRemoteServiceCallback实现与客户端对话。

于 2017-05-26T13:17:24.233 回答