在Android系统中实现AIDL 自定义对象传递

2024-09-05 07:58

本文主要是介绍在Android系统中实现AIDL 自定义对象传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  今天要在《在Android系统中实现AIDL接口回调》这篇文章的基础上实现AIDL自定义对象的传递功能。还是上一篇说到的三个项目:

├── SimpleJar
├── SimpleJarClient
└── SimpleJarService

一、在SimpleJar项目中添加aidl中要传递的对象StudentInfo.aidl跟StudentInfo.java,具体如下:

 ├── Android.mk
└── src
    └── com
        └── china
            └── jar
                ├── IVoiceCallBackInterface.aidl
                ├── IVoiceClientInterface.aidl
                ├── StudentInfo.aidl
                ├── StudentInfo.java
                ├── VoiceChangedListener.java
                └── VoiceManager.java
StudentInfo.aidl跟StudentInfo.java的代码实现如下:

package com.china.jar;
parcelable StudentInfo;
package com.china.jar;import android.os.Parcel;
import android.os.Parcelable;public class StudentInfo implements Parcelable{String name;int age;protected StudentInfo(Parcel in){name = in.readString();age = in.readInt();}public StudentInfo(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeInt(age);}public static final Creator<StudentInfo> CREATOR = new Creator<StudentInfo>() {@Overridepublic StudentInfo createFromParcel(Parcel in) {return new StudentInfo(in);}@Overridepublic StudentInfo[] newArray(int size) {return new StudentInfo[size];}};
}

 由于是跨进程之间的通信,所以传递对象需要序列化,让StudentInfo实现Parcelable。这样就可以在IVoiceClientInterface.aidl中使用StudentInfo对象进行数据传递了,如下:

package com.china.jar;
import com.china.jar.IVoiceCallBackInterface;
import com.china.jar.StudentInfo;
interface IVoiceClientInterface{void face();void registerCallBack(IVoiceCallBackInterface callback);void unRegisterCallBack(IVoiceCallBackInterface callback);void registerUser(in StudentInfo studentInfo);
}

二、在SimpleJarService项目的SimpleService.java类中实现 registerUser(in StudentInfo studentInfo)方法,具体实现如下:

├── AndroidManifest.xml
├── Android.mk
├── libs
│  ├── android-support-v4.jar
│  ├── fw.jar
│  └── simple.jar
├── res
│  ├── drawable-hdpi
│  │  └── ic_launcher.png
│  ├── drawable-ldpi
│  ├── drawable-mdpi
│  │  └── ic_launcher.png
│  ├── drawable-xhdpi
│  │  └── ic_launcher.png
│  ├── layout
│  ├── values
│  │  ├── strings.xml
│  │  └── styles.xml
│  ├── values-v11
│  │  └── styles.xml
│  └── values-v14
│      └── styles.xml
└── src
    └── com
        └── china
            └── service
                ├── BootReceiverBroadcast.java
                ├── Logger.java
                ├── SimpleControl.java
                └── SimpleService.java
 

package com.china.service;import com.china.jar.IVoiceCallBackInterface;
import com.china.jar.IVoiceClientInterface;
import com.china.jar.StudentInfo;
import com.china.jar.VoiceChangedListener;
import com.china.jar.VoiceManager;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;public class SimpleService extends Service{private static VoiceClientInterfaceImpl mBinder;@Overridepublic IBinder onBind(Intent intent) {Logger.d();return mBinder;//跟客户端绑定}@Overridepublic void onCreate() {super.onCreate();Logger.d();if (null == mBinder){initService();}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Logger.d();if (null == mBinder){initService();}return START_STICKY;}//实现AIDL的接口private class VoiceClientInterfaceImpl extends IVoiceClientInterface.Stub{protected RemoteCallbackList<IVoiceCallBackInterface> mRemoteCallbackList = new RemoteCallbackList<IVoiceCallBackInterface>();private SimpleControl control;public VoiceClientInterfaceImpl(){control = new SimpleControl(voiceChangedListener);}@Overridepublic void face() throws RemoteException {Logger.d("face----excute!");//客户端调用face方法时这里会执行,会打印face----excute!}//注册回调@Overridepublic void registerCallBack(IVoiceCallBackInterface arg0)throws RemoteException {Logger.d();mRemoteCallbackList.register(arg0);}//注销回调@Overridepublic void unRegisterCallBack(IVoiceCallBackInterface arg0)throws RemoteException {Logger.d();mRemoteCallbackList.unregister(arg0);}//调用回调方法private VoiceChangedListener voiceChangedListener = new VoiceChangedListener() {@Overridepublic void openAppByVoice(String arg0) {Logger.d("arg0 = " + arg0);int len = mRemoteCallbackList.beginBroadcast();for (int i = 0; i <len; i++) {try {mRemoteCallbackList.getBroadcastItem(i).openAppByVoice(arg0);} catch (RemoteException e) {e.printStackTrace();}}mRemoteCallbackList.finishBroadcast();}};@Overridepublic void registerUser(StudentInfo studentInfo) throws RemoteException {Logger.d("name = " + studentInfo.getName() + " ,age = " + studentInfo.getAge());}}//初始化服务,主要是向系统注册服务private void initService(){Logger.d();if (null == mBinder){synchronized (SimpleService.class) {if (null == mBinder){try {mBinder = new VoiceClientInterfaceImpl();ServiceManager.addService(VoiceManager.NAME, mBinder);} catch (Exception e) {e.printStackTrace();}}}}}
}

 registerUser(in StudentInfo studentInfo)方法体中实现非常简单,就是打印学生姓名跟年龄。

三、在SimpleJarClient项目中调用registerUser(in StudentInfo studentInfo)方法,进行自定义对象的数据传递,如下:

 ├── AndroidManifest.xml
├── Android.mk
├── libs
│  └── simple.jar
├── res
│  ├── drawable-hdpi
│  │  └── ic_launcher.png
│  ├── drawable-ldpi
│  ├── drawable-mdpi
│  │  └── ic_launcher.png
│  ├── drawable-xhdpi
│  │  └── ic_launcher.png
│  ├── drawable-xxhdpi
│  │  └── ic_launcher.png
│  ├── layout
│  │  ├── activity_main.xml
│  │  ├── activity_tss.xml
│  │  ├── test.xml
│  │  ├── usb.xml
│  │  └── version.xml
│  ├── menu
│  ├── values
│  │  ├── dimens.xml
│  │  └── strings.xml
│  ├── values-v11
│  ├── values-v14
│  └── values-w820dp
│      └── dimens.xml
└── src
    └── com
        └── example
            └── helloworld
                ├── TestVoice.java
                ├── UsbTest.java
                └── util
                    ├── Logger.java
                    └── USBUtil.java
 

package com.example.helloworld;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;import com.china.jar.StudentInfo;
import com.china.jar.VoiceChangedListener;
import com.china.jar.VoiceManager;
import com.example.helloworld.util.Logger;public class TestVoice extends Activity{VoiceManager voiceManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.version);voiceManager = VoiceManager.getInstance();if (voiceManager != null){voiceManager.addVoiceChangedListener(new VoiceChangedListener() {//客户端的监听及实现@Overridepublic void openAppByVoice(String arg0) {Logger.d("packageName = " + arg0);}});}voiceManager.registerUser(new StudentInfo("赵敏", 18));//aidl中客户端传递自定义对象StudentInfo到服务端}public void startVoice(View view){Logger.d();Intent intent = new Intent();intent.setClass(TestVoice.this, UsbTest.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}public void stopVoice(View view){Logger.d();VoiceManager.getInstance().face();}public void finishVoice(View view){Logger.d();finish();}
}

四、运行结果如下:

 

代码参考路径:https://github.com/gunder1129/android-tool/tree/master/AIDLdemo

 

 

 

 

 

这篇关于在Android系统中实现AIDL 自定义对象传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138379

相关文章

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操