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 未绑定到远程服务 的相关文章

随机推荐

  • 无法解析名为“存储”的 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