AIDL Client 未绑定到远程服务

2024-01-08

我正在尝试使用远程服务运行简单的乘法。我有 AIDL 服务器文件声明和定义方法。在AIDL中,我在服务器的包名称下复制了与服务器相同的AIDL文件。 我已经给出了服务器服务的意图过滤器的操作。 我的 AIDL 客户端代码仍然没有连接到该服务。

AIDL服务器:

Manifest

<service
            android:name=".CalService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote">
            <intent-filter>
                <action android:name="mutliply"/>
            </intent-filter>
        </service>

ICalService.aidl

interface ICalService {
        String getMessage(String name);
        int getResult(int val1, int val2);
}

CalService.java

public class CalService extends Service {
    public CalService() {
    }

    private final ICalService.Stub binder = new ICalService.Stub() {
        @Override
        public String getMessage(String name) throws RemoteException {
            return "Hello " + name + ". The result is: ";
        }

        @Override
        public int getResult(int val1, int val2) throws RemoteException {
            return val1 * val2;
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
}

AIDLC客户端:

MainActivity.java

@Override
    protected void onStart() {
        super.onStart();
        editName = (EditText) findViewById(R.id.editName);
        editVal1 = (EditText) findViewById(R.id.editVal1);
        editVal2 = (EditText) findViewById(R.id.editVal2);
        resultView = (TextView) findViewById(R.id.resultView);

        if(calService == null) {
            Log.v("CALSERVICE", "cal service null");
            Intent it = new Intent("multiply");
            it.setPackage("com.example.aidlserver");
            if(getBaseContext().getApplicationContext().bindService(
                    it, connection, Context.BIND_AUTO_CREATE
            ) == true){
                Log.v("Bind", "Bind service Succeeded");
            } else {
                Log.v("Bind", "Bind service failed");
            }
        } else {
            Log.v("Cal", "Cal Service not null");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
    }

    public void mutiply(View v) {
        switch (v.getId()) {
            case R.id.btnCal:
                int num1 = Integer.parseInt(editVal1.getText().toString());
                int num2 = Integer.parseInt(editVal2.getText().toString());
                try {
                    int result = calService.getResult(num1, num2);
                    String msg = calService.getMessage(editName.getText().toString());
                    resultView.setText(msg + result);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
        }
    }


    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("onServiceConnected", "Connected");
            calService = ICalService.Stub.asInterface(service);
            Toast.makeText(getApplicationContext(), "Service Connected",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("onServiceDisconnected", "Disconnected");
            calService = null;
            Toast.makeText(getApplicationContext(), "Service Disconnected",
                    Toast.LENGTH_SHORT).show();
        }
    };

该代码显示了在调用 bindService 时使用的隐式意图。

Intent it = new Intent("multiply");
it.setPackage("com.example.aidlserver");

如果您的 API 级别高于 21,则必须以明确的意图更新代码。请使用 setClassName() API 更新您的代码,以便以明确的意图进行绑定服务调用。

    Intent it = new Intent("multiply");            
    it.setClassName("com.example.aidlserver","com.example.aidlserver.CalService");
    if(getBaseContext().getApplicationContext().bindService(it, connection, Context.BIND_AUTO_CREATE) == true){
        Log.v("Bind", "Bind service Succeeded");
    } else {
        Log.v("Bind", "Bind service failed");
    }

请注意以下事项:

注意:为了确保您的应用程序安全,请始终使用显式 启动服务时的意图,并且不声明意图过滤器 您的服务。使用隐式意图来启动服务是 安全隐患,因为您无法确定所提供的服务 响应意图,用户无法看到哪个服务启动了。 从 Android 5.0(API 级别 21)开始,系统会抛出 如果您以隐式意图调用bindService(),则会出现异常。 参考:https://developer.android.com/guide/components/services https://developer.android.com/guide/components/services

也检查一下这个,

“要接收隐式意图,您必须在意图过滤器中包含 CATEGORY_DEFAULT 类别”

<category android:name="android.intent.category.DEFAULT"/>

https://developer.android.com/guide/components/intents-filters#Receiving https://developer.android.com/guide/components/intents-filters#Receiving

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AIDL Client 未绑定到远程服务 的相关文章

  • 控制 OverlayItem 大小

    我正在构建一个在单个 ItemizedOverlay 中包含几十个 OverlayItems 的地图 我的地图设计为可以非常近距离地查看 大约缩放级别 18 并且 OverlayItems 彼此非常接近 地图放大时看起来不错 但是 如果用户
  • 是否可以通过 Android 应用程序来录音?

    我是一名开发人员 希望创建一个 Android 应用程序来记录电话 这是出于我个人的需要 为了我自己的目的和记录而记录电话 是否有可能做到这一点 是否可以访问麦克风以及通过扬声器发出的声音 我对 Android 开发有点陌生 所以请耐心等待
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 如何将 Android 添加到 Phonegap 平台版本 3

    经过大量挖掘 我相信这个问题 https stackoverflow com questions 18423444 phonegap 3 doesnt work with andriod studio与我没有添加任何用于构建phonegap
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 无法使用 findViewById() 找到视图

    我找不到TextView通过致电findViewById 即使 ID 确实存在 OtherActivity public class OtherActivity extends Activity Override protected voi
  • Android模拟器中的网络访问

    我试图通过我的 Android 应用程序访问互联网 但我既成功又失败 我在构建应用程序时启动模拟器 并且应用程序安装得很好 我可以使用浏览器访问互联网 但是 当我尝试这个小代码片段时 InetAddress inet try inet In
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • 当目标小于 Android O 时,如何在 Android O 上创建快捷方式?

    背景 Android O 对快捷方式的工作方式进行了各种更改 https developer android com preview behavior changes html as https developer android com
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu

随机推荐

  • 无法解析名为“存储”的 Azure 存储连接 - Azure 持久函数

    我的项目 包 json name azure functions version 1 0 0 description scripts start func start test echo No tests yet dependencies
  • C++ 中是否可以重载运算符结合性?

    我正在构建一个具有稍微不对称添加的类 在投诉到来之前 它必然是不对称的 当两个对象相加时 必须发生转换 需要一些时间的操作 并且转换最自然地发生在正确的被加数上 为了具体说明这一点 这里有一个正在发生的事情的通用示例 class Foo c
  • 停止通过疯狂的按钮点击生成的多个视图调用(Django 应用程序)

    我正在基本 Django Web 应用程序中上传图像文件 有一个uploadhtml 模板中的按钮被form标签 一旦upload按钮被按下 底层view接管并处理图像上传 在我同事 Macbook 的 Chrome 浏览器中 按uploa
  • 确定映射是否包含键的值?

    确定 STL 映射是否包含给定键的值的最佳方法是什么 include
  • 使用 jQuery 获取图像 src

    img src img arnold png alt Arnold 如何使用 jQuery 获取该图像的绝对路径 img attr src 给我只是 img 阿诺德 png 应该给出类似 http site com data 2011 im
  • 使用 SSE-KMS 的 S3 分段上传

    我正在尝试使用 aws java sdk 1 11 230 编写一个实用程序 我可以使用 PutObjectRequest 使用 SSE KMS 编写文件 如下所示 PutObjectRequest putRequest new PutOb
  • 无法加载类型“NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle”

    Well 当我阅读并尝试每个类似的主题但都没有成功时 我决定发布我自己的问题 我的解决方案有一个控制台应用程序和一个用于数据访问的类库 Nhibernate 配置位于控制台应用程序中的 appconfig 内 我目前正在使用它进行调试 因为
  • 如何在 OS X 中获取 Bash 版本号

    我正在编写一个需要 Bash 4 x 的安装脚本 此安装脚本也可以在 OSX 上使用 我知道在 Linux 系统上我可以通过检查来获取 Bash 版本echo BASH VERSIONenv 变量 但如何在达尔文中获取 bash 版本 跑步
  • 无法在 Google 应用模拟器中添加 google 帐户

    我正在尝试实现我的第一个 Android C2DM 应用程序 我在添加谷歌帐户时遇到困难 我的机器位于代理后面 但我添加了一个包含代理 端口 用户名 密码详细信息的 APN 我可以使用浏览器进入谷歌帐户页面 我已经尝试过http和https
  • Java 序列化:readObject() 与 readResolve()

    这本书有效的Java和其他来源提供了关于如何以及何时使用的很好的解释readObject 使用可序列化 Java 类时的方法 这readResolve 另一方面 方法仍然有点神秘 基本上我发现的所有文件要么只提到两者之一 要么只单独提到两者
  • 如何在react.js中使用setProps

    我想打电话setProps从外部myComponent能够动态更改数据myComponent 我希望在更改组件的道具后 它将重新渲染自身 我正在尝试以下操作 var myComponent React createClass render
  • AWS Elastic mapreduce 似乎没有正确地将流媒体转换为 jar

    我有一个映射器和减速器 当我在管道版本中运行它们时 它们可以正常工作 cat data csv mapper py sort k1 1 reducer py 我使用了弹性mapreducer向导 加载了输入 输出 引导程序等 引导程序成功
  • Pyspark - 使用collect_list时保留空值

    根据接受的答案 in pysparkcollect set或collect list与groupby https stackoverflow com questions 37580782 pyspark collect set or col
  • 安装valgrind,启动时出现致命错误

    我正在安装 Valgrind 但遇到一些问题 我的平台信息 Linux xx ThinkPad X61 3 2 0 39 generic pae 62 Ubuntu SMP Wed Feb 27 22 25 11 UTC 2013 i686
  • 两个 kubernetes 集群之间的 mTLS

    我正在尝试在两个 kubernetes 集群中的两个应用程序之间获取 mTLS 而无需使用 Istio 的方式 通过其入口网关 我想知道以下内容是否可行 对于 Istio Likerd Consul 假设我们有一个 k8s 集群 A 和一个
  • React Router browserHistory 适用于本地,不适用于生产

    每当我在本地使用 browserHistory 时 我都没有问题 但是当我在发货之前测试它时 我会得到一个带有错误的空白页面 因此 当我用 hashHistory 替换 browserHistory 时 一切正常 但我丢失了漂亮的网址 未捕
  • Thymeleaf - 如何有条件地将选中的属性添加到输入

    如你所知 input组件有一个属性 checked是否将复选框标记为默认启用
  • Activity 从下到上滑动,但后台 Activity 不应移动

    我正在尝试将一项活动从底部滑动到顶部 这是我能够做到的 但是 当从底部滑动到顶部时 我的后台活动也滑动到底部 我想将后台活动保持在与原来相同的位置 以便新活动在打开时看起来像是后台活动的覆盖 这是我的slide in up xml
  • 在 R 中将点图保存为 pdf [重复]

    这个问题在这里已经有答案了 当在函数内执行此命令时 我无法将点图保存为 pdf 正常调用时效果很好 df lt data frame a runif 10 b runif 10 c runif 10 x 1 10 pdf test pdf
  • AIDL Client 未绑定到远程服务

    我正在尝试使用远程服务运行简单的乘法 我有 AIDL 服务器文件声明和定义方法 在AIDL中 我在服务器的包名称下复制了与服务器相同的AIDL文件 我已经给出了服务器服务的意图过滤器的操作 我的 AIDL 客户端代码仍然没有连接到该服务 A