好处:多个应用程序之间建立共同的服务机制,通过AIDL在不同应用程序之间达到数据的共享和数据相互操作,

本文包括: 1 、创建AIDL 服务端。2 、创建AIDL 客户端。 3、客户端调用服务端提供的服务接口。

1、创建AIDL 服务端。

在Android的src中新建IStudentService.aidl

package com.example.studentservice;
import com.example.studentservice.Student;; interface IStudentService
{
Map getMap(in String test_class,in Student student);
Student getStudent(); }

Student 类是一个序列化的类,这里使用Parcelable 接口来序列化. Student  类代码如下:

package com.example.studentservice;

import android.os.Parcel;
import android.os.Parcelable; public class Student implements Parcelable{
private int age;
private String name; public Student(Parcel source) {
// TODO Auto-generated constructor stub
age = source.readInt();
name = source.readString();
} public Student() {
// TODO Auto-generated constructor stub
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() { @Override
public Student[] newArray(int size) {
// TODO Auto-generated method stub
return new Student[size];
} @Override
public Student createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new Student(source);
}
}; @Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeInt(age);
dest.writeString(name);
} }

在这里必须注意如下三点:

1.在Student 类中必须有一个静态常量,常量名必须是CREATOR,而且CREATOR 常量的数据类型必须是 Parcelable.Creator

2.在writeToParcel 方法中需要将要序列化的值写入到 Parcel对象中。

3.编写完Student 为时,必须再新建一个Student.aidl 文件,此文件输入以下内容:
parcelable Student; 这里的书写是供上面我们说过的接口   *.aidl 文件导包时可以找到,并通过此文件找到Student类对象。

如果上面的步骤顺利通过的话,Android 将会自动在gen 目录下R文件的相同目录生成一个以*.aidl 文件命名的*.java 文件,如下图:

顺利生成成功后,我们再来编写一个AIDL 服务类,代码如下:

package com.example.studentservice;
import java.util.HashMap;
import java.util.Map;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException; public class StudentService extends Service{ @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new StudentServiceImple();
} public class StudentServiceImple extends IStudentService.Stub { @Override
public Student getStudent() throws RemoteException
{
Student student = new Student();
student.setAge(25);
student.setName("Zhang san");
return student;
} @Override
public Map getMap(String test_class, Student student)
throws RemoteException {
// TODO Auto-generated method stub
Map<String, Object> map = new HashMap<String, Object>();
map.put("class", "06109091");
map.put("age", student.getAge());
map.put("name", student.getName());
return map; }
} }

如上代码,StudentService服务类有一个子类并继承自我们上面生成的*.java 文件重写其中我们在*.aidl 中声明的两个接口方法,实现了其功能。上面IBinder 必须返回此服务类的子类对象,否则客户端将无法获得服务对象。

最后,即然有服务的操作,那么就得在manifest文件中注册服务类,代码如下:

        <service android:name=".StudentService"  android:exported="true"  android:enabled="true"
android:process=":remote">
<intent-filter>
<action android:name="com.example.studentservice.IStudentService"></action>
</intent-filter>
</service>

至此,服务端就己经开发完成了,下面接着开发客启端。

2、创建AIDL 客户端

同样是新建一个项目,这里要注意,需要将服务端生成成功后的gen 目录下的包复制过来,放到我们新建项目的src 文件夹下,如下图:

因为IServiceService 这个生成类,引用到了Student, 所以这里一并将Student也复制过来。

至此,客户端的创建己经完毕,下面我们就要利用创建的客户端去调用服务端的方法。

3、客户端调用服务端提供的服务接口

package com.example.studentclient;

import com.example.studentservice.IStudentService;

import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity {
private Button btn1, btn2;
private IStudentService stuService = null;
private ServiceConnection serviceConnection = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub } @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
stuService = IStudentService.Stub.asInterface(service);
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
btn1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
bindService(new Intent("com.example.studentservice.IStudentService"),
serviceConnection, Context.BIND_AUTO_CREATE);//;
}
});
btn2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
try {
if (stuService == null) {
new AlertDialog.Builder(MainActivity.this).setTitle("Error")
.setMessage("stuService is null").setPositiveButton(
android.R.string.ok, null).show(); return;
}
sb.append("学生名称为:" + stuService.getStudent().getName() + "\n");
sb.append("年龄为:" + stuService.getStudent().getAge() + "\n");
sb.append("map 对象内容为如下:"
+ stuService.getMap("中国", stuService.getStudent())
.toString());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new AlertDialog.Builder(MainActivity.this).setTitle("调用外部服务")
.setMessage(sb.toString()).setPositiveButton(
android.R.string.ok, null).show(); }
});
} }

在ServiceConnetction里面对IMyService 进行初始化,即可操作该对象 ,该对象就可以得到我们所有要处理的数据。

小结:使用aidl 必须同时存在客户端和服务端,即客户端在本机上,服务端也在本机上,要使用客户端必须服务端事先在本机上注册过服务。

我自己写了源码,还不知道在博客园如何长传源码,如果你知道,请告之,谢谢!

参考资料

Android服务使用

Android中Service的使用详解和注意点(LocalService)

Android 使用AIDL调用外部服务 (RemoteService)

Android 使用AIDL调用外部服务的更多相关文章

  1. ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)

    一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...

  2. .netcore 3.1高性能微服务架构:封装调用外部服务的接口方法--HttpClient客户端思路分析

    众所周知,微服务架构是由一众微服务组成,项目中调用其他微服务接口更是常见的操作.为了便于调用外部接口,我们的常用思路一般都是封装一个外部接口的客户端,使用时候直接调用相应的方法.webservice或 ...

  3. 在Android开发中调用Rest web服务(转)

    首先从维基百科上拷贝一点Rest的基本概念给大家看看,然后我们再开始详解在Android中如何调用Rest服务.表象化状态转变(英文:Representational State Transfer,简 ...

  4. Android之——AIDL深入

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47071927 在上一篇博文<Android之--AIDL小结>中,我们 ...

  5. SqlServer调用CLR服务

    作用 从数据库发起对外部服务的请求. 应用场景 心跳监测 定时启动站点 服务实现 代码部分(C#) using System; using System.Net; publicpartialclass ...

  6. istio: 无法提供内部访问外部服务

    现象 能够内部无法访问外部服务. 在部署测试服务 kubectl apply -f samples/sleep/sleep.yaml 设置环境变量 export SOURCE_POD=$(kubect ...

  7. Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务

    1. 概述 bindService() 绑定服务  可以得到服务的代理人对象,间接调用服务里面的方法. 绑定服务: 间接调用服务里面的方法.           如果调用者activity被销毁了, ...

  8. android 不同进程间的调用 AIDL 实现通讯服务

    android 不同进程间的调用  AIDL 实现通讯服务       近期对aidl android 不同进程间的调用,不同运用间的调用做了一些尝试: 过程例如以下: 1:首先在要被调用的程序里写好 ...

  9. android基础---->AIDL服务的使用

    AIDL和其他的IDL类似,它允许你定义程序接口,以便客户端与服务器端通过IPC机制交互.在android上面,一个进程一般不能访问另外进程的内存.因此,Android平台将这些跨进程访问的对象分解成 ...

随机推荐

  1. 【转】阿里2015校招面试回忆(成功拿到offer)

    原文转自:http://blog.jobbole.com/78722/ 1. 引言 继上次<百度2015校园招聘面试题回忆(成功拿到offer)>文章过后,大家都希望除了题目之外,最好能给 ...

  2. 101+ Manual and Automation Software Testing Interview Questions and Answers

    101+ Manual and Automation Software Testing Interview Questions and Answers http://www.softwaretesti ...

  3. ios layoutsubView 何时被调用

    -layoutSubviews方法:这个方法,在UIView中默认没有做任何事情,需要子类进行重写.UIView是一个纯净的视图,里面没有任何子控件,所以不会做什么事情.一般系统自带控件中有子控件的都 ...

  4. xp 安装 win7 64

    1.Win7文件准备 (1)下载Win7 的ISO文件到本机硬盘中 (2)用UltraISO等软件加载ISO文件,将win7目录下的bootmgr和boot文件夹复制到C盘根目录下,并在C盘 根目录下 ...

  5. [virsh] error: unknown OS type hvm解决办法

    今天在linux服务器上编译安装升级了下qemu,升级命令如下: root@ubuntu:/opt/qemu-# ./configure --prefix=/usr/local/ --target-l ...

  6. js 实现复制到剪切板 复制按钮兼容各大浏览器

    zeroclipboard官网:https://github.com/zeroclipboard/ZeroClipboard 下载压缩包,得到两个“ZeroClipboard.js”和“ZeroCli ...

  7. (实用篇)PHP实现队列及队列原理

    队列是一种线性表,按照先进先出的原则进行的: PHP实现队列:第一个元素作为队头,最后一个元素作为队尾 <?php /** * 队列就是这么简单 * * @link */ $array = ar ...

  8. Linux磁盘文件的命名

    磁盘的常用接口有两种:IDE和SATA接口,目前主流的是SATA接口. IDE接口由IDE扁平电缆线连接,一个电缆可连接两个IDE接口,通常主机又都会提供两个IDE接口,因此最多可以接到四个IDE设备 ...

  9. SAP系统联机应用程序帮助

    新安装好的SAP系统,联机帮助是不能用的. 通过菜单中的“帮助-应用程序帮助” 和“帮助-SAP库”都打不开任何帮助页面.这并不是因为SAPgui安装不完整,而是因为SAP的帮助系统本身就不包含在GU ...

  10. 319. Bulb Switche

    There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every ...