返回顶部
首页 > 资讯 > 移动开发 >Android中如何利用AIDL机制调用远程服务
  • 545
分享到

Android中如何利用AIDL机制调用远程服务

调用aidlAndroid 2022-06-06 08:06:14 545人浏览 薄情痞子
摘要

在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然, Java中是不支持跨进程内存共享的。因此要传递对象,需要把对象

Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然, Java中是不支持跨进程内存共享的。因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在JavaEE中,采用RMI通过序列化传递对象。在Android中,则采用aiDL(Android Interface DefinitionLanguage:接口描述语言)方式实现。

AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。

服务端:


//CalculateInterface.aidl
package com.itheima.aidl.calculate;
interface CalculateInterface {
double doCalculate(double a, double b);
}
//CalculateService.java
package com.itheima.myaidl.server;
import com.itheima.aidl.calculate.CalculateInterface;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class CalculateService extends Service{
private final CalculateInterface.Stub mBinder = new CalculateInterface.Stub() {
@Override
public double doCalculate(double a, double b) throws RemoteException {
return a+b;
}
};
@Override
public IBinder onBind(Intent intent) {
Log.i("test","onBind...");
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("test","onUnbind...");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.i("test","onCreate...");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("test","onDestroy...");
}
}
//服务端manifast文件
<manifest xmlns:android="Http://schemas.android.com/apk/res/android"
package="com.itheima.myaidl.server"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity 
android:name="com.itheima.myaidl.server.MainActivity"
android:confiGChanges="locale|layoutDirection"
android:theme="@android:style/Theme.Light.NoTitleBar"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<cateGory android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.itheima.myaidl.server.CalculateService">
<intent-filter>
<action android:name="com.itheima.myaidl.server.CalculateService" />
</intent-filter>
</service>
</application>
</manifest>
//客户端
//MainActivity.java
package com.itheima.myaidl.client;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.itheima.aidl.calculate.CalculateInterface;
public class MainActivity extends Activity {
private CalculateInterface mService;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("test","service disconnected...");
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("test","service connected...");
mService = CalculateInterface.Stub.asInterface(service); //获取接口实例
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定远程服务
Bundle bundle = new Bundle();
Intent intent = new Intent();
intent.putExtras(bundle);
intent.setAction("com.itheima.myaidl.server.CalculateService");
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
//TODO activity加载完毕时回调此方法
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if(hasFocus){
try{
double result = mService.doCalculate(1, 2);
Log.i("test","result===>"+result);
}catch(RemoteException e){
e.printStackTrace();
}
}
super.onWindowFocusChanged(hasFocus);
}
@Override
protected void onDestroy() {
unbindService(mServiceConnection); //解绑远程服务
super.onDestroy();
}
}

运行结果截图:

以上所述是小编给大家介绍的Android中如何利用AIDL机制调用远程服务的相关知识,希望对大家有所帮助!

您可能感兴趣的文章:Android应用程序四大组件之使用AIDL如何实现跨进程调用Service使用Android studio创建的AIDL编译时找不到自定义类的解决办法Android 使用【AIDL】调用外部服务的解决方法基于Android AIDL进程间通信接口使用介绍Android程序设计之AIDL实例详解实例讲解Android中的AIDL内部进程通信接口使用Android AIDL——进程通信机制详解Android Studio创建AIDL文件并实现进程间通讯实例Android编程实现AIDL(跨进程通信)的方法详解Android AIDL中Map参数传递的问题详解


--结束END--

本文标题: Android中如何利用AIDL机制调用远程服务

本文链接: https://lsjlt.com/news/25399.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中如何利用AIDL机制调用远程服务
    在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然, Java中是不支持跨进程内存共享的。因此要传递对象,需要把对象...
    99+
    2022-06-06
    调用 aidl Android
  • Android AIDL和远程Service调用示例代码
    Android:AIDL和远程Service调用 本讲的内容,理解起来很难,也许你看了很多资料也看不明白,但是用起来缺简单的要命。所以我们干脆拿一个音乐播放器中进度条的实例来...
    99+
    2022-06-06
    service 示例 aidl Android
  • Android 使用【AIDL】调用外部服务的解决方法
    在Android 中有一种服务说是服务其实倒不如说是一个接口,这个接口名为:Android Interface Definition Language ,这个接口可提供跨进程访...
    99+
    2022-06-06
    调用 方法 aidl Android
  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
    一、问题描述   Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程。在上一...
    99+
    2022-06-06
    service 进程 程序 aidl Android
  • Android Service的跨进程通信实战&amp;Service/AIDL远程调用过程解析(Android Q)
    Service的跨进程通信实战 设想这么一个场景,我们有2个APP(或者2个进程,均可),其中一个APP需要提供一个Person相关的服务(该...
    99+
    2022-06-06
    android service 实战 service 进程 调用 aidl 通信 Android
  • Android远程服务编写和调用教程
    网上汗牛充栋的文章都是介绍Android远程服务的,一个个将Binder机制、AIDL讲得头头是道,然而没有几个人能够给出清晰的范例说明如何用最快的方法学会编写和调用一个And...
    99+
    2022-06-06
    调用 教程 Android
  • SpringCloud中Feign如何远程调用
    这篇文章将为大家详细讲解有关SpringCloud中Feign如何远程调用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言先来看我们以前利用RestTemplate发起远程调用的代码:这里就有几个问题:...
    99+
    2023-06-22
  • C#开发中如何处理远程调用和远程过程调用
    C#开发中如何处理远程调用和远程过程调用,需要具体代码示例引言:随着云计算和分布式系统的快速发展,远程调用和远程过程调用(Remote Procedure Call,简称RPC)在软件开发中变得越来越重要。C#作为一种强大的编程语言,在处理...
    99+
    2023-10-22
    远程过程调用 远程调用 C#开发
  • SpringBoot2中怎么利用Dubbo框架实现RPC服务远程调用
    SpringBoot2中怎么利用Dubbo框架实现RPC服务远程调用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Dubbo框架简介1、框架依赖图例说明:1...
    99+
    2023-06-02
  • PHP中GC回收机制如何利用
    这篇文章主要介绍“PHP中GC回收机制如何利用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP中GC回收机制如何利用”文章能帮助大家解决问题。简单铺垫先看看这个简单的序列化,一定要先思考再看后面...
    99+
    2023-06-29
  • 如何在Python中利用paramiko远程连接服务器
    本篇文章为大家展示了如何在Python中利用paramiko远程连接服务器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学...
    99+
    2023-06-06
  • 手机如何远程控制云服务器设备使用手机
    首先,要连接到云服务器,你需要使用一个Wi-Fi网络或者专门的网络连接,这样可以确保设备连接到一个稳定的网络环境中。接下来,你需要登录云服务器,进入到你的应用程序或者控制面板中。在控制面板中,你可以看到云服务器的设置选项,包括用户账户、数据...
    99+
    2023-10-28
    手机 远程控制 服务器
  • 手机如何远程控制云服务器电脑使用
    如果您想远程控制云服务器电脑,请按照以下步骤操作: 打开控制面板,选择“网络和共享中心”。 点击“管理这台服务器”。 在弹出的菜单中,点击“远程协助”。 在弹出的窗口中,选择“允许远程管理”。 在远程协助窗口中,勾选需要远程控制的云服务...
    99+
    2023-10-27
    远程控制 服务器 电脑
  • 手机如何远程控制云服务器设备使用
    如果您的手机具有云服务的功能,您可以通过以下步骤远程控制云服务器设备: 打开“设置”应用。 打开“远程桌面”应用。 在“远程桌面”应用中,选择“服务器”选项卡。 在服务器设置中,找到“管理员权限设置”。 在“管理员权限设置”中,可以找到...
    99+
    2023-10-27
    远程控制 服务器 设备
  • openstack中的rpc如何远程调用
    本篇内容介绍了“openstack中的rpc如何远程调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是 RPC看不明白这个图对于看no...
    99+
    2023-06-20
  • 怎么在Unity中利用反射机制调用函数
    这期内容当中小编将会给大家带来有关怎么在Unity中利用反射机制调用函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。using System.Reflection;using Uni...
    99+
    2023-06-07
  • 手机如何远程控制云服务器
    如果您想远程控制云服务器,可以尝试以下几种方法: 利用云服务器控制端控制:您可以在云服务器控制端上设置您的应用程序、文件、邮件等访问权限和安全措施,以便您可以控制您的云服务器。您可以通过在控制台上输入指令来访问云服务器中的文件、文件夹和...
    99+
    2023-10-26
    远程控制 服务器 手机
  • 如何利用VB编写一个远程控制程序
    这篇文章主要为大家展示了“如何利用VB编写一个远程控制程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何利用VB编写一个远程控制程序”这篇文章吧。一、所用控件在程序中将使用Winsock控件...
    99+
    2023-06-17
  • 利用java如何调用存储过程
    本篇文章给大家分享的是有关利用java如何调用存储过程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。详解java调用存储过程并封装成map   &...
    99+
    2023-05-31
    java ava
  • win11开机远程调用失败如何解决
    开机远程调用失败可能由多种原因引起,以下是一些可能的解决方法:1. 确保网络连接正常:检查网络连接是否正常,确保网络连接稳定并且能够...
    99+
    2023-09-17
    win11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作