好处:多个应用程序之间建立共同的服务机制,通过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. 转载:CancellationToken

    http://www.cnblogs.com/Abbey/archive/2011/09/12/2174208.html 最近在学习.NET中的线程同步.其中一个重要的技术叫线程的取消(中止),涉及的 ...

  2. 如何在magento后台增加一个自定义订单状态

    magento后台订单状态(order status)只有Pending.Processing.On Hold.Closed.Canceled.Pending Payment 等等,如何在magent ...

  3. 转载: SQL Server中的索引

    http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上 ...

  4. 六 GPU 并行优化的几种典型策略

    前言 如何对现有的程序进行并行优化,是 GPU 并行编程技术最为关注的实际问题.本文将提供几种优化的思路,为程序并行优化指明道路方向. 优化前准备 首先,要明确优化的目标 - 是要将程序提速 2 倍? ...

  5. 总结 output 用法

    第一种用法 返回受 INSERT.UPDATE 或 DELETE 语句影响的每行的信息,或者返回基于上述每行的表达式.这些结果可以返回到处理应用程序, 以供在确认消息.存档以及其他类似的应用程序要求中 ...

  6. html中怎么去掉input获取焦点时候的边框

    如图   这个是在360浏览器极速模式下的效果 有个颜色的边框,,但是在兼容模式下就可以的呢 看看兼容模式下的效果 很显然 上面那个被高亮了,焦点的时候有边框 要怎么弄才能让他始终没有边框呢 2014 ...

  7. 百度APIStore

    链接 http://apistore.baidu.com/ 提供了许多免费的api接口,用来做功能性的查询

  8. UVa 489 刽子手游戏

    游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母则计算机会在一副"刽子手"画上填一笔,这幅画一共需要7笔就能完 ...

  9. 异步处理工具类:AsyncTask

    (一) AsyncTask,是android提供的轻量级的异步类.可以直接继承AsyncTask,在类中实现异步操作,可以通过接口实现UI进度更新,最后反馈执行的结果给UI主线程 .之所以有Handl ...

  10. java中将汉字转换成16进制

    技术交流群:233513714 /** * 将汉字转换车16进制字符串 * @param str * @return st */ public static String enUnicode(Stri ...