gpt4 book ai didi

Android远程服务回调

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:21:36 27 4
gpt4 key购买 nike

(我有一个带有 AIDL 接口(interface)的远程服务,它被多个客户端应用程序使用。我想为需要一些时间的调用向接口(interface)添加一个异步方法,但我需要安全的解决方案,这意味着只有我的应用程序才能与服务通信。客户端应用程序使用与服务应用程序相同的签名进行签名。目前,应用程序仅绑定(bind)到服务并调用单个接口(interface)执行各种操作的方法。

一个选项是在操作完成时从服务广播一个 Intent 并在客户端应用程序中使用 BroadcastReceiver,但是(问题 #1)这能否以一种确保仅我的方式来完成应用程序可以接收 Intent? setPackage() 似乎是这样做的,但我需要支持 Gingerbread 设备,这似乎根据这里的答案排除了这种方法:setPackage for intent in gingerbread

所以看来我需要添加第二个 .aidl 接口(interface)和回调接口(interface)供服务使用,由客户端实现。我在这里看到了使用监听器的示例,但我不确定与仅将第二个接口(interface)对象作为参数传递的客户端有什么区别(如此答案的 IScript/IScriptResult 示例中所用:Service call backs to activity in android)

问题 #2,在这里使用监听器与回调方法相比有什么好处?

最佳答案

回调方法/监听器是正确的做法。 (正如 CommonsWare 所说,这几乎是一回事)。我会说这比摆弄 BroadcastReceivers 简单得多,因为您已经在使用 aidl。

像这样:

IAsyncThing.aidl:

package com.my.thingy;

import com.my.thingy.IAsyncThingListener;

interface IAsyncThing {
void doSomething(IAsyncThingListener listener);
}

IAsyncThingListener.aidl:

package com.my.thingy;

import com.my.thingy.IAsyncThingListener;

interface IAsyncThingListener {
void onAsyncThingDone(int resultCodeIfYouLike);
}

您可以通过对您的服务使用签名级权限来强制只有您的应用程序可以绑定(bind)到该服务(请参阅此处关于“服务权限”的说明:http://developer.android.com/guide/topics/security/permissions.html)。具体来说:

  • 在服务的 AndroidManifest.xml 中声明权限。确保它是 signature 级别。
  • 在您的 service 标签中添加该权限
  • 在所有其他应用中,使用 uses-permission 来使用它。

还有几点需要注意:

  • 在调用者中,您需要继承IAsyncThingListener.Stub。您的调用应用程序代码可能已经在子类化其他内容,因此这意味着您必须使用额外的(可能是内部的)类来接收完成通知。我提到这一点只是因为这可能是问题 #2 的答案——我并不完全理解。
  • 如果服务可能与调用者位于不同的进程中,则每个服务都应使用 IBinder.linkToDeath 注册对方的死亡通知。

关于Android远程服务回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com