我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android远程服务编写和调用教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android远程服务编写和调用教程

网上汗牛充栋的文章都是介绍Android远程服务的,一个个将Binder机制、AIDL讲得头头是道,然而没有几个人能够给出清晰的范例说明如何用最快的方法学会编写和调用一个Android远程服务。若你仅仅是想如何编写或者调用Android的远程服务,而懒得去理解Binder机制是如何运行的,那么本篇文章正好适合你。毕竟现在人人都会开车,但没有几个人明白发动机到底是如何运作的。

预备知识

读者应该有基本的java知识,和Android简单app的开发经验。

环境

代码运行环境:
1.ADT2014版本;
2.android:minSdkVersion=”8”;android:targetSdkVersion=”20”
3.workspace中已经生成了appcompatv7,它的版本是android-22;

远程服务开发教程

在开始开发之前,先弄清楚几个概念:
1. IPC:进程间通信,你只需要知道Android是依赖这个东西来进行远程服务调用的就可以了。
2. Binder机制:Android发明的一种IPC机制,据说非常非常的好,你就当它是个黑盒子,通过这个黑盒子就可以进行远程服务调用了,而且Android中的很多机制都是通过它实现的。
3. AIDL语言:一种专门用来写远程接口的语言,看它的名字就知道了,Android Interface Definition
Language。AIDL语言可以被android提供的编译器编译为Java源代码,这个Java源代码将会被服务的和客户端使用,用来简化远程服务开发流程。如果你当初玩过CORBA,那就更能明白什么是IDL语言了
4. IInterface接口、IBinder接口、IBinder类等等:都是用来实现Binder机制的接口和类,在本教程中,你就当它们是Binder黑盒子的一部分,不需要了解。
再说一点,其实Android提供的ApiDemos中就有一个远程服务的标准范例,但是其一是它没有将服务端和客户端分开写,其二是例子中掺杂了太多其他的功能,因此理解起来较为困难。这个例子是com.example.android.apis.app.RemoteService,有兴趣的可以在看完本文后再去详细研究。

第一步,创建一个普通Android应用

应用名为WxbRemoteService,这个应用可以删掉其Activity类,但是为了简单,我们就保留所有自动创建的代码。

第二步,编写AIDL

AIDL语言的语法和Java其实很像,你甚至可以先编写一个Java接口,然后删掉public、protected、private这些权限限定词即可。例子如下IWxbService.aidl:


package com.dumaisoft.wxbremoteservice;
interface IWxbService {
 void setName(String name);
 String getName();
}

注意几点:
1.接口名和aidl文件名相同。
2.接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static。
3.Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、 CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作 为参数或返回值,自定义类型必须实现Parcelable接口。
4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。
5.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。
6.Java原始类型默认的标记为in,不能为其它标记
IWxbService.aidl文件的位置是在com.dumaisoft.wxbremoteservice包中,只要语法正确,则会在ADT的gen目录下的com.dumaisoft.wxbremoteservice包中生成java文件IWxbService.java。
IWxbService.aidl定义了一个远程接口,它包含两个方法getName和setName。

第三步,编写服务类

添加一个WxbService类,它继承了Service类,源代码如下:


package com.dumaisoft.wxbremoteservice;
import com.dumaisoft.wxbremoteservice.IWxbService.Stub;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class WxbService extends Service {
 private ServiceImpl serviceImpl;
 //继承由IWxbService.aidl生成的com.dumaisoft.wxbremoteservice.IWxbService.Stub类
 class ServiceImpl extends Stub{
  private String _name;
  @Override
  public void setName(String name) throws RemoteException {
   _name = name;
  }
  @Override
  public String getName() throws RemoteException {
   return _name;
  }
 }
 //将ServiceImpl做一个简单的单例模式
 private ServiceImpl getInstance(){
  if(serviceImpl == null){
   serviceImpl = new ServiceImpl();
  }
  return serviceImpl;
 }
 @Override
 public IBinder onBind(Intent intent) {
  return getInstance();
 }
}

通过研究代码可知,和普通的服务类相比,远程服务类最大的区别就是它拥有一个名为ServiceImpl的成员变量,这个成员变量继承了Stub类,并实现了Stub类的getName和setName方法。这个Stub类就是由 IWxbService.aidl生成的IWxbService.java提供的。我们不用研究其源代码,只用知道它的用法:
第一:让Service的一个成员变量继承Stub,并实现远程接口的方法;
第二:在Service的onBind方法中返回一个Stub子类的实例。

第四步,配置AndroidManifest.xml

加上如下代码:


  <service android:name="WxbService">
   <intent-filter>
    <action android:name="com.dumaisoft.wxbremoteservice.REMOTE_SREVICE"/>
   </intent-filter>
  </service>

注意action的name为”com.dumaisoft.wxbremoteservice.REMOTE_SREVICE”,这个由开发者保证不重名即可。

第五步,安装app到手机上

安装完成后,你的远程服务就被注册到Binder黑盒子中了,任何客户端只要知道你的远程服务action名称和接口,就可以bind服务,并调用接口。

远程服务调用教程

第一步,创建一个android应用

应用名为WxbRemoteServiceClient,class="lazy" data-src包中自动生成了com.dumaisoft.wxbremoteserviceclient包。

第二步,引入远程服务的AIDL文件

在class="lazy" data-src包中创建com.dumaisoft.wxbremoteservice包(为了与服务端的包名相同),然后将上面编写的IWxbService.aidl文件拷贝入此目录。显然,在本工程的gen目录中也生成了IWxbService.java文件。

第三步,编写调用远程服务的代码

代码如下:


package com.dumaisoft.wxbremoteserviceclient;
import com.dumaisoft.wxbremoteservice.IWxbService;
import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
 private Button btnBind;
 private Button btnSetName;
 private Button btnGetName;
 private IWxbService serviceProxy; //远程服务的代理
 private ServiceConnection conn = new ServiceConnection() {
  @Override
  public void onServiceDisconnected(ComponentName name) {  
  }
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   //获取远程服务代理
   serviceProxy = IWxbService.Stub.asInterface(service);
  }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  btnBind = (Button) this.findViewById(R.id.btnBind);
  btnSetName = (Button) this.findViewById(R.id.btnSetName);
  btnGetName = (Button) this.findViewById(R.id.btnGetName);
  btnBind.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent service = new Intent();
    //Remote Service Action name
    service.setAction("com.dumaisoft.wxbremoteservice.REMOTE_SREVICE");
    bindService(service, conn, Service.BIND_AUTO_CREATE);
   }
  });
  btnSetName.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    try {
     serviceProxy.setName("MyName");
    } catch (RemoteException e) {
     e.printStackTrace();
    }
   }
  });
  btnGetName.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    try {
     String name = serviceProxy.getName();
     Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG).show();
    } catch (RemoteException e) {
     e.printStackTrace();
    }
   }
  });  
 }
}

注意几点:
一、创建一个ServiceConnection的匿名子类,在其onServiceConnected方法中获取远程服务代理对象serviceProxy。事实上,onServiceConnected方法会在bindService方法调用时被调用,因此能确保一定可以获得远程服务的代理对象;
二、IWxbService.Stub.asInterface(service)方法也是由IWxbService.java文件提供的,其内部机制不用研究,只需要知道它会返回一个IWxbService接口的对象,该对象可以通过Binder黑盒子调用远程服务的setName和getName方法;
三、使用Intent指定action为”com.dumaisoft.wxbremoteservice.REMOTE_SREVICE”,即可正确的bind到远程服务。
四、bind成功后,就可以通过远程服务的代理对象,使用远程服务的功能了。

小结

至此,读者应该能比较快速的开发出一个远程服务,并能编写客户端轻松的调用它了。还有一点需要说明的是,除了使用AIDL来进行远程服务的编写和调用外,还可以直接使用IBinder、Binder等接口和类来进行远程服务编写调用。

您可能感兴趣的文章:利用ASP从远程服务器上接收XML数据的方法ColdFusion MX 远程服务实例入门教程可以从一台远程服务器运行 SP2 安装程序Install.vbsC# FTP,GetResponse(),远程服务器返回错误将MSSQL Server 导入/导出到远程服务器教程的图文方法分享python 从远程服务器下载东西的代码python 从远程服务器下载日志文件的程序java判断远程服务器上的文件是否存在的方法利用xcopy命令实现本地文件复制到远程服务器的方法


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android远程服务编写和调用教程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android远程服务编写和调用教程

网上汗牛充栋的文章都是介绍Android远程服务的,一个个将Binder机制、AIDL讲得头头是道,然而没有几个人能够给出清晰的范例说明如何用最快的方法学会编写和调用一个Android远程服务。若你仅仅是想如何编写或者调用Android的远
2022-06-06

【Android平板编程】远程Ubuntu服务器code-server编程写代码

文章目录 前言1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址5.结语 前言   本次教程将在 Ubuntu 服务器环境下安装 co
2023-08-19

Android AIDL和远程Service调用示例代码

Android:AIDL和远程Service调用本讲的内容,理解起来很难,也许你看了很多资料也看不明白,但是用起来缺简单的要命。所以我们干脆拿一个音乐播放器中进度条的实例来说明一下AIDL和Remote Service的价值和使用方法,你把
2022-06-06

Android中使用DialogFragment编写对话框的实例教程

Android提供alert、prompt、pick-list,单选、多选,progress、time-picker和date-picker对话框,并提供自定义的dialog。在Android 3.0后,dialog基于fragment,并
2022-06-06

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

在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢显然, Java中是不支持跨进程内存共享的。因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在JavaEE中
2022-06-06

Android应用开发中Action bar编写的入门教程

从Android 3.0开始除了我们重点讲解的Fragment外,Action Bar也是一个重要的内容,Action Bar主要是用于代替传统的标题栏,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更
2022-06-04

Python使用SocketServer模块编写基本服务器程序的教程

SocketServer简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和Thre
2022-06-04

Android编程调用Camera和相册功能详解

本文实例讲述了Android编程调用Camera和相册功能。分享给大家供大家参考,具体如下: xml:2022-06-06

SpringCloud远程服务怎么调用

这篇文章主要介绍SpringCloud远程服务怎么调用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!笔记在微服务中,若想要使用远程调用,需要引入spring-cloud-starter-openfeign(在使用注册
2023-06-21

python程序调用远程服务的方法

小编给大家分享一下python程序调用远程服务的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言项目是基于python3的PC桌面项目。因为需要对外发布we
2023-06-07

如何远程云服务器使用教程

安装云服务器首先,您需要从云服务器供应商的网站上下载相应的操作系统、数据库和网络驱动程序。安装这些软件后,您需要创建一个新的虚拟机。在虚拟机中,您可以创建一个云服务器实例,然后将其分配给远程计算机。配置云服务器一旦您已经准备好虚拟机,您需要在本地机器上安装所需的软件和驱动程序。在本地机器上,您可以使用操作系统自带的管理
2023-10-27

Android中编写简单的手电筒小应用的实例教程

主要实现两个步骤: 1、实现打开和关闭闪光灯;而实现操作闪光灯主要通过Camera类Camera camera = Camera.open(); Parameters mParameters = camera.getParameters(
2022-06-06

Android中使用Camera类编写手机拍照App的实例教程

Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下。它主要用于摄像头捕获图片、启动/停止预览图片、拍照、获取视频帧等,它是设备本地的服务,负责管理设备上的摄像头硬件。 Camera
2022-06-06

用Go编写金融服务应用程序

随着金融科技的飞速发展,金融行业对于技术的需求也越来越高。建立高可用、高并发的金融服务系统已经成为了金融企业发展的重要任务之一。而Go语言正好具有高并发、高性能、高可维护性等优势,在金融服务的实现上也有着广泛的应用。本文将介绍使用Go语言框
用Go编写金融服务应用程序
2024-01-22

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录