在android开发过程中,为了让其他的应用程序,也可以访问本应用程序的服务,android系统采用远程过程调用来实现。android通过接口来公开定义的服务。我们将能够夸进程访问的服务成为AIDL服务(Android Interface Definition Language)。本节主要讲述通过aidl服务来传递数据。aidl支持的数据类型“简单数据类型、String和char、List和Map、aidl自动生成的接口、实现android.Parcelable的类。

1.建立aidl服务

在Eclipse中建立android_adil应用程序,在java的包目录中建立一个IMyService.aidl文件.

 package com.example.android_demo_aidl;
import com.example.android_demo_aidl.Person;
interface IMyService
{
Map getMap(in String key,in Person person);
Person getPerson();
}

IMyService.aidl

Person是实现了parcelable接口的类,需要使用import导入。in表示该值可以在客户端设置,out表示该值可以在服务端设置,inout表示该值既可以在客户端设置,也可以再服务端设置。如果aidl正确,会自动生成IMyService.java文件。

在包中建立Person类。

 package com.example.android_demo_aidl;

 import android.os.Parcel;
import android.os.Parcelable; public class Person implements Parcelable { private int id;
private String name;
private int age;
public static final Parcelable.Creator<Person> CREATOR= new Parcelable.Creator<Person>() { @Override
public Person[] newArray(int size) {
// TODO Auto-generated method stub
return new Person[size];
} @Override
public Person createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new Person(source);
}
};
public Person()
{
}
private Person(Parcel in)
{
readFormParce(in);
}
private void readFormParce(Parcel in) {
// TODO Auto-generated method stub
id=in.readInt();
name=in.readString();
age=in.readInt(); }
public int describeContents()
{
return 0;
}
public void writeToParcel(Parcel dest,int flags)
{
dest.writeInt(id);
dest.writeString(name);
dest.writeInt(age);
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id=id;
}
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;
}
}

Person

Person类定义name,age等成员变量,实现了接口parcelable。同时必须定义CREATOR的常量,类型为Parcelable.Creator。在writeToParcel中将序列化的值传入Parcel。

建立Person.aidl

parcelable Person;

编写MyService类

 package com.example.android_demo_aidl;

 import java.util.HashMap;
import java.util.Map; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log; public class MyService extends Service { public class MyServiceImpl extends IMyService.Stub
{ @Override
public Map getMap(String key, Person person) throws RemoteException {
// TODO Auto-generated method stub
Map map = new HashMap<String,String>();
map.put("id", person.getId());
map.put("age", person.getAge());
map.put("name", person.getName());
map.put("person", person);
return map;
} @Override
public Person getPerson() throws RemoteException {
// TODO Auto-generated method stub
Person person = new Person();
person.setAge(18);
person.setId(1);
person.setName("Tom");
return person;
} }
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new MyServiceImpl();
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.d("test", "oncreate");
}
}

MyService

在MyService类中定义一个新类MyServiceIm继承于IMyService.Stub.需要实现在接口中定义的方法。MyService类继承android.Service,在绑定方法中,返回一个实例。

最后,在AndroidManifest.xml中配置该服务。

         <service android:name=".MyService">
<intent-filter >
<action android:name="com.example.android_demo_aidl.IMyService"/>
</intent-filter>
</service>

AndroidManifest.xml

android:name,在客户端通过该id调用服务。

2.调用服务

在Eclipse中建立新的android应用程序,android_ail_client。在调用服务之前,需要绑定服务,通过bindService进行服务的绑定。将服务端自动生成的IMyservice.java连同包一起复制到新的应用程序用。程序结构如下图

 package com.example.android_demo_aidl_client;

 import com.example.android_demo_aidl.IMyService;

 import android.support.v7.app.ActionBarActivity;
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.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends ActionBarActivity implements OnClickListener { private Button btnstart;
private Button btninvoke;
private IMyService myService=null;
private TextView textView;
private ServiceConnection conn=new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.d("test", "绑定错误");
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
myService=IMyService.Stub.asInterface(service);
btninvoke.setEnabled(true);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnstart=(Button)findViewById(R.id.button1);
btninvoke=(Button)findViewById(R.id.button2);
textView=(TextView)findViewById(R.id.textView1); btninvoke.setOnClickListener(this);
btnstart.setOnClickListener(this);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId())
{
case R.id.button1:
bindService(new Intent("com.example.android_demo_aidl.IMyService"), conn, Context.BIND_AUTO_CREATE);
break;
case R.id.button2:
try
{
String s="";
s="person.id="+myService.getPerson().getId()+"\n";
s+="person.name="+myService.getPerson().getName()+"\n";
s+="person.age="+myService.getPerson().getAge();
textView.setText(s);
}
catch(Exception e)
{
Log.d("test",e.getMessage());
}
break;
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unbindService(conn);
}
}

MainActivity

在该段代码中,通过ServiceConnection获取Aidl服务的对象实例。在调用服务之前需先绑定服务。

3.程序运行截图

运行的时候,需要先运行服务端程序,再运行客户端程序。

Android服务之AIDL的更多相关文章

  1. Android服务Service具体解释(作用,生命周期,AIDL)系列文章-为什么须要服务呢?

    Android服务Service具体解释(作用,生命周期,AIDL) 近期沉迷于上班,没有时间写博客了.解衣入睡,未眠.随起床写一篇博客压压惊! ##我们android系统为什么须要服务Service ...

  2. Android探索之AIDL实现进程间通信

    前言: 前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?Android系统中的进程之间不能共享内存,因此,需要提供 ...

  3. Android服务(Service)研究

    Service是android四大组件之一,没有用户界面,一直在后台运行. 为什么使用Service启动新线程执行耗时任务,而不直接在Activity中启动一个子线程处理? 1.Activity会被用 ...

  4. Android 中的AIDL,Parcelable和远程服务

    Android 中的AIDL,Parcelable和远程服务      早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用    ...

  5. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建   目录(?)[+] 什么是服务 服务有 ...

  6. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  7. Android开发了解——AIDL

    AIDL:Android Interface Definition Language,即Android接口定义语言. 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...

  8. (转载)Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  9. (转载)Android:学习AIDL,这一篇文章就够了(上)

    前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了.不过又转念一想, ...

随机推荐

  1. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  2. Linux进程控制——exec函数族

    原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是 ...

  3. Cisco cmd 命令(二)

    1.配置路由器静态路由选择表 ip route [destination_network] [mask] [next_hop_address or exitinterface] [administra ...

  4. uva 1594 Ducci Sequence <queue,map>

    Ducci Sequence Description   A Ducci sequence is a sequence of n-tuples of integers. Given an n-tupl ...

  5. hdu3081 Marriage Match II(最大流)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Marriage Match II Time Limit: 2000/1000 M ...

  6. hdu3599 War(最大流)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud War Time Limit: 2000/1000 MS (Java/Others ...

  7. 不用不知道 apply()与call()的强大

    在看关于javascript继承的时候 好多地方都用到了apply()和call() 之前在简单编程的时候根本没有遇到过 查阅资料后才发现这两个方法是如此的好用. 下面从几方面来看一下这两个方法: 1 ...

  8. 2.Perl基础系列之入门

    官网提供的入门链接:http://perldoc.perl.org/perlintro.html 语法概述 Perl的安装步骤省略,直接去官网下载并按照提示安装即可. 如果Perl安装没问题,那么运行 ...

  9. HDU ACM 题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

  10. Strtus2工作流程及原理

    从上图可以看出,一个请求在Struts2 框架中的处理大概分为以下几个步骤:1.客户端初始化一个指向Servlet 容器(例如Tomcat)的请求:2.这个请求经过一系列的过滤器(Filter)(这些 ...