公司的网站建设费用入什么科目/外贸营销网站建设

公司的网站建设费用入什么科目,外贸营销网站建设,成都网站建设开发公,肇庆高端品牌网站建设一、背景 使用AIDL,搭建Client和Server端,实现跨进程通讯,即两个应用之间可以相互通讯。这里列举AIDL实现的方式和需注意的细节,并附上源码。 二、实现方式 2.1 定义AIDL需要的接口,名字为xxx.aidl,Client和Server端 AIDL接口的包名和aidl文件必须一致&#xff0c…

一、背景

使用AIDL,搭建Client和Server端,实现跨进程通讯,即两个应用之间可以相互通讯。这里列举AIDL实现的方式和需注意的细节,并附上源码。

二、实现方式

2.1 定义AIDL需要的接口,名字为xxx.aidl,Client和Server端 AIDL接口的包名和aidl文件必须一致,在main 目录下,新建aidl目录,如下截图:

Server 端:

Client端:

2.2 IMessageManager.aidl文件
import com.vc.aidlservice.IOnServerCallback;interface IMessageManager {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);//客户端发送消息给服务端void sendMessageToServer(String message);//服务端发送消息给客户端void sendMessageToClient(String message);//注册监听,用于服务端主动发送消息给客户端void registerListener(IOnServerCallback callback);//注销监听void unRegisterListener();
}
2.3 IOnServerCallback.aidl 文件
package com.vc.aidlservice;// Declare any non-default types here with import statementsinterface IOnServerCallback {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/
//    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
//            double aDouble, String aString);//用于客户端接收服务端发送的消息void onMessageReceived(String message);

三、Server端代码

3.1 VcService (AIDL服务端具体逻辑实现)
package com.vc.aidlserver.serviceimport android.app.Service
import android.content.Intent
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.os.Message
import android.util.Log
import android.widget.Toast
import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.JSONObject
import com.vc.aidlclient.bean.MessageInfo
import com.vc.aidlclient.enums.MessageType
import com.vc.aidlserver.MyApplication
import com.vc.aidlservice.IMessageManager
import com.vc.aidlservice.IOnServerCallback/*** @Time : On 2024/12/6 16:00* @Description : VcService*/
class VcService :Service(){private val TAG="AIDL_Server_"private val SEND_MSG_FAIL=0private val SEND_MSG_SUCCESS=1private var mCallback:IOnServerCallback?=nullprivate val mHanler=object:Handler(Looper.getMainLooper()){override fun handleMessage(msg: Message) {val msgValue=msg.whatif(msgValue==SEND_MSG_FAIL){Toast.makeText(MyApplication.instance,"连接未建立,发送消息失败",Toast.LENGTH_SHORT).show()}else{Toast.makeText(MyApplication.instance,"发送消息成功",Toast.LENGTH_SHORT).show()}}}override fun onBind(intent: Intent): IBinder {return binder}private val binder= object : IMessageManager.Stub() {override fun basicTypes(anInt: Int,aLong: Long,aBoolean: Boolean,aFloat: Float,aDouble: Double,aString: String?) {}/*** 接收客户端发送的消息*/override fun sendMessageToServer(message: String) {Log.d("$TAG", "VcService 服务端收到客户端消息:$message")try {val jsonObject = JSON.parseObject(message)val  requestId = jsonObject.getString("requestId")val  type = jsonObject.getString("type")val contentObject = jsonObject.getJSONObject("content")val message = contentObject.getString("message")val callbackMessage= MessageInfo.Message("应用:$packageName 收到透传的消息:$message,,,响应返回")val messageInfo=MessageInfo("callback:$requestId", MessageType.Server.toString(),callbackMessage)val jsonMessage= JSONObject.toJSONString(messageInfo)mCallback?.onMessageReceived(jsonMessage)}catch (e:Exception){Log.e("$TAG", "VcService 服务端解析客户端客户端消息异常 Exception:${e.message}")}}/*** 主动发送消息给客户端*/override fun sendMessageToClient(message: String?) {Log.d("$TAG", "VcService 服务端发送消息给客户端:$message,,,mCallback:$mCallback,,,是否主线程:${Looper.getMainLooper()==Looper.myLooper()}")if(mCallback==null){mHanler.sendEmptyMessage(SEND_MSG_FAIL)Log.d("$TAG", "VcService 连接未建立,sendMessageToClient fail,,,message:$message")return}mHanler.sendEmptyMessage(SEND_MSG_SUCCESS)mCallback?.onMessageReceived(message)}/*** 客户端调用注册监听*/override fun registerListener(callback: IOnServerCallback?) {mCallback=callback}/*** 客户端调用注销监听*/override fun unRegisterListener() {Log.d("$TAG", "VcService unRegisterListener")mCallback=null}}}
3.2 Server端主动发送消息给Client端
package com.vc.aidlserverimport android.content.ComponentName
import android.content.Intent
import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.alibaba.fastjson.JSONObject
import com.vc.aidlclient.RequestIdCreatUtil
import com.vc.aidlclient.bean.MessageInfo
import com.vc.aidlclient.enums.MessageType
import com.vc.aidlserver.service.VcService
import com.vc.aidlservice.IMessageManagerclass MainActivity : AppCompatActivity() {private var bt_send: Button? = nullprivate var edt_message: EditText? = nullvar mIMessageManager: IMessageManager? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main_send_message)bt_send = findViewById(R.id.bt_send)edt_message = findViewById(R.id.edt_message)/***在VcService外,获取 mIMessageManager,服务端主动发送消息给AIDL客户端*/val intent = Intent(this, VcService::class.java)val result = bindService(intent, object : ServiceConnection {override fun onServiceConnected(name: ComponentName, service: IBinder) {Log.d("BBBBB", "onServiceConnected 连接服务端成功 name:$name")mIMessageManager = IMessageManager.Stub.asInterface(service) as IMessageManager}override fun onServiceDisconnected(name: ComponentName) {Log.d("BBBBB", "onServiceDisconnected 断开服务端连接 name:$name")}}, BIND_AUTO_CREATE)/*** 服务端主动发送消息给AIDL客户端*/bt_send?.setOnClickListener {Log.d("BBBBB", " mIMessageManager:$mIMessageManager")val message = edt_message?.text.toString().trim()if (message.isNullOrEmpty()) {Toast.makeText(this, "发送消息不能为空", Toast.LENGTH_SHORT).show()return@setOnClickListener}if (mIMessageManager == null) {Toast.makeText(this, "绑定VcService失败,应用发送消息失败", Toast.LENGTH_SHORT).show()} else {val sendMessage = MessageInfo.Message(message)val messageInfo = MessageInfo(RequestIdCreatUtil.creatId(),MessageType.Server.toString(),sendMessage)val jsonMessage = JSONObject.toJSONString(messageInfo)mIMessageManager!!.sendMessageToClient(jsonMessage)//Toast.makeText(this,"应用发送消息成功",Toast.LENGTH_SHORT).show()Log.d("BBBBB", "sendMessageToClient:$jsonMessage")}}}}
3.3  AndroidManifest.xml配置
     <service android:name=".service.VcService"android:enabled="true"android:exported="true"android:process=":remote"><intent-filter><action android:name="com.vc.aidlserver.service.VcService" /></intent-filter></service>

四、Client端代码

4.1 Client 逻辑代码
package com.vc.aidlclientimport android.content.ComponentName
import android.content.Intent
import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.alibaba.fastjson.JSONObject
import com.vc.aidlclient.bean.MessageInfo
import com.vc.aidlclient.enums.MessageType
import com.vc.aidlservice.IMessageManager
import com.vc.aidlservice.IOnServerCallbackprivate var mIMessageManager: IMessageManager? = null
private var isConnect = falseclass MainActivity : AppCompatActivity(), View.OnClickListener {private var bt_connect: Button? = nullprivate var bt_send: Button? = nullprivate var bt_disconnect: Button? = nullprivate var isBound = falseprivate val TAG = "AIDL_Client_"override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)bt_connect = findViewById(R.id.bt_connect)bt_send = findViewById(R.id.bt_send)bt_disconnect = findViewById(R.id.bt_disconnect)bt_connect?.setOnClickListener(this)bt_send?.setOnClickListener(this)bt_disconnect?.setOnClickListener(this)}/*** 连接服务端*/fun connectServer() {val intent = Intent()intent.setComponent(ComponentName("com.vc.aidlserver","com.vc.aidlserver.VcService"))isBound = bindService(intent, mServiceConnection, BIND_AUTO_CREATE)Log.d("$TAG", "bindService  isBound:$isBound")}private val serverListener = object : IOnServerCallback.Stub() {override fun onMessageReceived(message: String?) {Log.d("$TAG", "onMessageReceived :$message")}}/*** 销毁监听器*/private fun destroyService() {try {if (isBound) {isConnect = falsemIMessageManager?.unRegisterListener()mIMessageManager = nullunbindService(mServiceConnection)}} catch (e: Exception) {e.printStackTrace()Log.d("$TAG", "unbindService Exception:${e.message}")}}override fun onDestroy() {Log.d("$TAG", "onDestroy()")super.onDestroy()destroyService()}override fun onClick(v: View) {if (v.id == R.id.bt_connect) {if (isConnect) {Toast.makeText(this, "已连接服务端", Toast.LENGTH_SHORT).show()} else {connectServer()}} else if (v.id == R.id.bt_send) {if (mIMessageManager == null || !isConnect) {Toast.makeText(this, "连接未建立", Toast.LENGTH_SHORT).show()} else {val message = MessageInfo.Message("我是客户端")val messageInfo = MessageInfo(RequestIdCreatUtil.creatId(),MessageType.Client.toString(),message)val jsonMessage = JSONObject.toJSONString(messageInfo)Log.d("$TAG", "客户端发送消息给服务端 jsonMessage->>>:$jsonMessage")mIMessageManager?.sendMessageToServer(jsonMessage)}} else if (v.id == R.id.bt_disconnect) {destroyService()}}private val mServiceConnection = object : ServiceConnection {override fun onServiceConnected(name: ComponentName, service: IBinder) {// 服务连接成功,你可以开始与服务交互Log.d("$TAG", "onServiceConnected 连接服务端成功 name:$name")isConnect = truemIMessageManager = IMessageManager.Stub.asInterface(service) as IMessageManagermIMessageManager?.registerListener(serverListener)}override fun onServiceDisconnected(name: ComponentName) {// 服务断开连接Log.d("$TAG", "onServiceDisconnected 断开服务端连接 name:$name")destroyService()}}
}
4.2 build.gradle配置

注:不配置无法生效aidl文件,Server端也一样,需要配置,有可能和AS版本有关,博主Android studio版本:Android Studio Koala Feature Drop | 2024.1.2

4.3 AndroidManifest.xml
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"tools:ignore="QueryAllPackagesPermission"/><queries><package android:name="com.vc.aidlserver"/></queries>

Client需要配置以上,否则存在连接不上服务端现象

五、完整源码下载

源码下载连接:https://download.csdn.net/download/banzhuantuqiang/90159482

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VUE】14、VUE项目如何自动识别服务端是否发布了新版本

今天介绍的是通过轮询的方式去检测服务端是否发布了新版本&#xff0c;从而提醒客户刷新页面&#xff0c;提升用户体验。 1、实现思路 使用轮询的方式获取项目中 index.html 文件。查询文件引入的 JS 文件是否有更新&#xff08; Vue 每次打包后会生成新的引入文件&#xff0…

空天地遥感数据识别与计算--数据分析如何助力农林牧渔、城市发展、地质灾害监测等行业革新

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

多智能体/多机器人网络中的图论法

一、引言 1、网络科学至今受到广泛关注的原因&#xff1a; &#xff08;1&#xff09;大量的学科&#xff08;尤其生物及材料科学&#xff09;需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解&#xff1b; &#xff08;2&#xff09;科技的发展促进了综合网…

python数据分析:介绍pandas库的数据类型Series和DataFrame

安装pandas pip install pandas -i https://mirrors.aliyun.com/pypi/simple/ 使用pandas 直接导入即可 import pandas as pd pandas的数据结构 pandas提供了两种主要的数据结构&#xff1a;Series 和 DataFrame,类似于python提供list列表&#xff0c;dict字典&#xff0c;…

Python:枚举(包含例题字符计数,反倍数,洁净数,扫雷)

一.枚举是什么 枚举&#xff1a;通过逐个尝试所有可能的值或组合来解决问题的方法。 将问题空间划分为一系列离散的状态&#xff0c;并通过遍历这些状态来寻找解决方案。 二.枚举流程 1.确定解空间&#xff08;一维&#xff0c;二维等&#xff09; 2.确定空间边界&#xff…

设计模式之 abstract factory

适用场景 一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库&#xff0c;而只想显示它们的接口而不是实现时 架构演示 首先client这个东西可以接触到…

linux-----数据库

Linux下数据库概述 数据库类型&#xff1a; 关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;如MySQL、PostgreSQL、Oracle等。这些数据库以表格的形式存储数据&#xff0c;表格之间通过关系&#xff08;如主键 - 外键关系&#xff09;相互关联。关系型数据库支持复杂的…

鸿蒙学习笔记:用户登录界面

文章目录 1. 提出任务2. 完成任务2.1 创建鸿蒙项目2.2 准备图片资源2.3 编写首页代码2.4 启动应用 3. 实战小结 1. 提出任务 本次任务聚焦于运用 ArkUI 打造用户登录界面。需呈现特定元素&#xff1a;一张图片增添视觉感&#xff0c;两个分别用于账号与密码的文本输入框&#…

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…

通过阿里云 Milvus 和 LangChain 快速构建 LLM 问答系统

背景介绍 阿里云向量检索 Milvus 版是一款云上全托管服务&#xff0c;确保了与开源Milvus的100%兼容性&#xff0c;并支持无缝迁移。在开源版本的基础上增强了可扩展性&#xff0c;能提供大规模 AI 向量数据的相似性检索服务。相比于自建&#xff0c;目前阿里云Milvus具备易用…

LeetCode刷题day29——动态规划(完全背包)

LeetCode刷题day29——动态规划&#xff08;完全背包&#xff09; 377. 组合总和 Ⅳ分析&#xff1a; 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09;题目描述输入描述输出描述输入示例输出示例提示信息 分析&#xff1a; 322. 零钱兑换分析&#xff1a; 279. 完全平方数分…

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

LabVIEW伸缩臂参数监控系统

LabVIEW开发伸缩臂越野叉车参数监控系统主要应用于工程机械中的越野叉车&#xff0c;以提高车辆的作业效率和故障诊断能力。系统通过PEAK CAN硬件接口和LabVIEW软件平台实现对叉车作业参数的实时监控和故障分析&#xff0c;具有良好的实用性和推广价值。 系统组成 系统主要由P…

【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )

文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…

YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现

概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程&#xff0c;本节主要介绍ONNX Runtime的原理以及使用其进行推理加速&#xff0c;使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…

python学opencv|读取图像(十六)修改HSV图像HSV值

【1】引言 前序学习进程中&#xff0c;我们已经掌握了对HSV通道和BGR通道的拆分和合并&#xff0c;并通过自由组合的形式&#xff0c;获得了和初始图像完全不一样的新图像&#xff0c;相关文章可以参考下述链接&#xff1a; python学opencv|读取图像&#xff08;十四&#xf…

CEF127 编译指南 MacOS 篇 - 编译 CEF(六)

1. 引言 经过前面的准备工作&#xff0c;我们已经完成了所有必要的环境配置。本文将详细介绍如何在 macOS 系统上编译 CEF127。通过正确的编译命令和参数配置&#xff0c;我们将完成 CEF 的构建工作&#xff0c;最终生成可用的二进制文件。 2. 编译前准备 2.1 确认环境变量 …

关于小程序内嵌h5打开新的小程序

关于小程序内嵌h5打开新的小程序 三种方式 https://juejin.cn/post/7055551463489011749 只依赖于h5本身的就是 https://huaweicloud.csdn.net/64f97ebb6b896f66024ca16c.html https://juejin.cn/post/7055551463489011749 navigateToMiniProgram 故小程序webview里的h5无法…

开发平台接口规范:北斗终端->北斗三号卫星->指挥机(北斗终端)->北斗短报文融合平台->客户平台(上行)| 时空信息产品

文章目录 引言I 技术架构和业务流程技术架构北斗终端信息流II 渠道接口验证签名白名单IP渠道配置表设计III 其他辅助功能TCP 发送消息到消息中心nginx转发网关服务异常捕获日志采集IV 知识扩展对请求参数进行校验引言 开发平台的应用场景:平台需要开发能力给下游平台需要接收上…

知识分享第三十天-力扣343.(整数拆分)

343 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你可…