Service的双向跨进程通信

一、客户端向服务端通信。

1、创建AIDL文件,用于生成跨进程通信代码。

// ITestService.aidl
package com.example.servicetest;

interface ITestService {
    void sayHello();
}

2、创建服务端Service,添加如下代码。

public class TestService extends Service {

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

    class TestBinder extends ITestService.Stub {
        @Override
        public void sayHello() throws RemoteException {
            Log.i("TestService","Hello Service!");
        }
    }
}

3、在AndroidManifest.xml中声明刚添加的Service。

<service
    android:name=".TestService"
    android:exported="true"
    android:process="com.test">
    <intent-filter>
        <action android:name="com.example.service.test"/>
    </intent-filter>
</service>

4、客户端绑定服务端Service,并与服务端进行通信。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent();
    intent.setAction("com.example.service.test");
    // Android高版本中必须要设置包名,不然会报错
    intent.setPackage("com.example.servicetest");
    // 绑定服务端Service
    bindService(intent, conn, Context.BIND_AUTO_CREATE);
}

ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        try {
            // 获取服务端Service的引用
            ITestService testService = ITestService.Stub.asInterface(service);
            // 与服务端进行通信
            testService.sayHello();
        } catch (RemoteException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {}
};

5、如果客服端与服务端通信成功,则会打印"Hello Service!"。

二、服务端与客户端进行通信。

1、新建AIDL文件,用与服务端与客户端的通信。

// ICallback.aidl
package com.example.servicetest;

interface ICallback {
    void reply(String msg);
}

2、在ITestService.aidl文件中添加新的接口register。

// ITestService.aidl
package com.example.servicetest;
import com.example.servicetest.ICallback;

interface ITestService {
    void sayHello();
    void register(ICallback callback); // 新添加的
}

3、在MainActivity中添加ICallback的实现,并将callback对象传递给服务端Service。

ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        try {
            // 获取服务端的引用
            ITestService testService = ITestService.Stub.asInterface(service);
            // 与服务端进行通信
            testService.sayHello();
            // 将callback对象传递给服务端Service
            testService.register(callback);
        } catch (RemoteException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {}
};

ICallback callback = new ICallback.Stub() {
    @Override
    public void reply(String msg) throws RemoteException {
        Log.i("MainActivity", msg);
    }
};

4、服务端Service的register的实现如下。

class TestBinder extends ITestService.Stub {
    @Override
    public void sayHello() throws RemoteException {
        Log.i("TestService","Hello Service!");
    }

    @Override
    public void register(ICallback callback) throws RemoteException {
        callback.reply("Nice to meet you!"); // 服务端向客户端通信
    }
}

5、如果服务端与客户端通信成功,则会打印"Nice to meet you!"。

附录:项目文件结构图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/207665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring cloud gateway源码分析,一个请求进来的默认处理流程

1.前言 spring cloud gateway的基本组成和作用就不细赘述&#xff0c;此篇适合对此有一定了解的人阅读。 spring cloud gateway版本: Hoxton.SR1 spring cloud gateway的配置使用yml配置&#xff1a; server:port: 9527y#根据微服务名称进行动态路由的配置 spring:applicati…

elk+filebeat+kafka集群部署

EFK实验架构图&#xff1a; 实现高并发&#xff0c;无需指定logstash 3台esfile&#xff0c;3台kafka 20.0.0.10 esfile 20.0.0.20 esfile 20.0.0.30 esfile 20.0.0.11 kafka 20.0.0.12 kafka 20.0.0.13 kafka在es1主机上解压filebeat cd filebeat 安装nginx服务 vim /usr/loc…

Prometheus集群模式部署日记-主节点篇

Prometheus架构组件主节点masterPrometheus-master&#xff0c;Alertmanger&#xff0c;Grafana&#xff0c;PrometheusAlert子节点node(不同网络&#xff0c;混合云环境)Prometheus-node1 所有组件均采用docker-compose部署&#xff0c;docker 和 compose 请自行安装不再赘述…

软件开发的生命周期:从构想到维护

目录 需求分析阶段 设计阶段 实现阶段 测试阶段 部署阶段 维护阶段 结语 软件开发是一项复杂而又精密的工程&#xff0c;它的整个过程被称为软件开发生命周期。这一生命周期涵盖了从最初构想到最终维护的各个阶段&#xff0c;每个阶段都有其独特的任务和活动。在本文中&…

计算一个4+4+1的队形变换问题

2 2 1 1 2 2 2 2 1 1 2 2 3 3 A A 3 3 4 4 A 12 4 4 4 4 12 A 4 4 2 2 1 1 2 2 操场上有4个人以4a1的结构在6*6的平面上运动&#xff0c;行分布是0&#xff0c;0&#xff0c;0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;列分布…

【爬虫逆向分析实战】某笔登录算法分析——本地替换分析法

前言 作者最近在做一个收集粉币的项目&#xff0c;可以用来干嘛这里就不展开了&#x1f601;&#xff0c;需要进行登录换算token从而达到监控收集的作用&#xff0c;手机抓包发现他是通过APP进行计算之后再请求接口的&#xff0c;通过官网分析可能要比APP逆向方便多&#xff0…

SSM项目实战-service实现

1、SysUserService.java package com.atguigu.schedule.service;import com.atguigu.schedule.pojo.SysUser;public interface SysUserService {SysUser getSysUser(SysUser sysUser); }2、SysUserServiceImpl.java package com.atguigu.schedule.service.impl; import com.atg…

Verilog 入门(五)数据流模型化

文章目录 连续赋值语句时延 连续赋值用于数据流行为建模&#xff1b;相反&#xff0c;过程赋值用于顺序行为建模。组合逻辑电路的行为最好使用连续赋值语句建模。 连续赋值语句 连续赋值语句将值赋给线网&#xff08;连续赋值不能为寄存器赋值&#xff09;&#xff0c;它的格式…

[python模块]python3.12版本利用whl文件快速安装dlib库(无需安装cmake)

截止目前网上还没有人可以做出python3.12版本的whl的dlib模块&#xff0c;但是我这边做到了&#xff0c;采用复杂编译流程终于测试完成&#xff0c;并且顺利安装在python3.12环境中&#xff0c;虽然dlib之前网上有很多python3.11以下版本&#xff0c;但是python3.12绝对是独家首…

[论文阅读]Sparse Fuse Dense

SFD Sparse Fuse Dense: Towards High Quality 3D Detection with Depth Completion 论文网址&#xff1a;SFD 论文代码&#xff1a;SFD 论文简读 本文主要关注如何利用深度完成技术提高三维目标检测的质量。论文提出了一种名为 SFD&#xff08;Sparse Fuse Dense&#xff0…

单页应用的架构与设计:打造高效可扩展的 Web 应用(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

力扣 --- 加油站

题目描述&#xff1a; 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个…

计算机导论——第37章 磁盘驱动器

关键问题&#xff1a;如何存储和访问磁盘上的数据 现代磁盘驱动器如何存储数据&#xff1f;接口是什么&#xff1f;数据是如何安排和访问的&#xff1f;磁盘调度如何提高性能&#xff1f; 1. 接口 驱动器制造商唯一保证的是单个512字节的写入是原子的&#xff0c;即它将完整地…

口袋参谋:关键词一秒卡首页,实战操作步骤!

​近期有不少的新手商家来问&#xff0c;关于淘宝卡首屏的事情。据我了解至少有99%的中小卖家&#xff0c;是不了解淘宝卡首屏的&#xff01; 那什么是淘宝卡首屏&#xff1f;有什么好处&#xff1f;如何操作&#xff1f;今天我来跟你们好好说道说道&#xff01;小本本都准备好…

Visual Studio通过ClaudiaIDE插件设置背景图片

首先&#xff0c;在VS菜单栏上选择扩展-管理扩展&#xff0c;搜索插件为 ClaudiaIDE&#xff0c; 下载完成之后&#xff0c;关闭VS&#xff0c;点击Modify按钮安装&#xff1a; 等待安装完成&#xff0c;进入 VS , 打开 工具----选项---- ClauDiaIDE 界面 这个是背景色调 我选的…

anaconda3的激活和Cvcode配置C++:报错:CondaIOError: Missing write permissions in:

报错&#xff1a;CondaIOError: Missing write permissions in: 原因&#xff1a;anaconda所在文件夹只有root 才有权限 查看用户名 whoamisudo chown -R 用户名 /home/anaconda3激活anaconda3 #激活 source activate #退出 source deactivate 配置Cvcode配置C 首先看g的…

matlab diff和gradient

gradient 求解梯度。 示例 FX gradient(F) 返回向量 F 的一维数值梯度。输出 FX 对应于 ∂F/∂x&#xff0c;即 x&#xff08;水平&#xff09;方向上的差分。点之间的间距假定为 1。 使用方法&#xff1a; x -2:0.2:2; y x’; z x .* exp(-x.^2 - y.^2); [px,py] gradien…

11-28 SpringBoot1

约定大于配置 简化Spring开发, spring boot致力于简洁&#xff0c;让开发者写更少的配置&#xff0c;程序能够更快的运行和启动。它是下一代javaweb框架&#xff0c;并且它是spring cloud(微服务)的基础。dev-ops:开发者,运维者。 springboot特点:优点面试重点 1)为基于Spring…

带头结点的双向循环链表

目录 带头结点的双向循环链表 1.存储定义 2.结点的创建 3.结点的初始化 4.尾插结点 5.尾删结点 6.头插结点 7.头删结点 8.查找并返回结点 9.在pos结点前插入结点 10.删除pos结点 11.打印链表 12.销毁链表 13.头插结点2.0版 14.尾插结点2.0版 前言&#xff1a; 当…

go开发之个人微信号机器人开发

简要描述&#xff1a; 下载消息中的文件 请求URL&#xff1a; http://域名地址/getMsgFile 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型…