android跨进程调用Service(AIDL服务)

        这是一个调用AIDL Service列子,传输的数据类型是自定义类型。分别是Person和Pet,Person对象作为远程Service调用的参数,而Pet作为返回值。android要求远程Service的参数和返回值都必须是想Parcelable接口,其实是想Parcelable接口就是一种序列化机制,实现这个接口必须实现接口里定义的方法,而且要要在实现类中定义一个名为CREATOR、类型为Parcelable.Creator的静态Field,还要使用AIDL代码来定义远程接口和自定义类型。

一、创建一个Service项目:ComplexService,包名为:com.sdh.complexservice,其中包括的文件如下:

1.Person.aidl

package com.sdh.complexservice;
parcelable Person;

2.Person.java,实现Parcelable接口的Person类

package com.sdh.complexservice;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable 
{
	private Integer id;
	private String name;
	private String pass;
	public Person(){}
	public Person(Integer id, String name, String pass) {
		super();
		this.id = id;
		this.name = name;
		this.pass = pass;
	}
    
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((pass == null) ? 0 : pass.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (pass == null) {
			if (other.pass != null)
				return false;
		} else if (!pass.equals(other.pass))
			return false;
		return true;
	}
	//实现Parcelable接口必须实现的方法
	public int describeContents() 
	{
		return 0;
	}
	//实现Parcelable接口必须实现的方法
	public void writeToParcel(Parcel dest, int flags)
	{
		dest.writeInt(id);
		dest.writeString(name);
		dest.writeString(pass);
	}
	public static final Parcelable.Creator<Person> CREATOR=
			new Parcelable.Creator<Person>() 
	{

		public Person createFromParcel(Parcel source) {
			return new Person(source.readInt(),source.readString(),
					source.readString());
		}

		public Person[] newArray(int size) {
			return new Person[size];
		}
		
	};
}

3.Pet.aidl

package com.sdh.complexservice;
parcelable Person;

4.Pet.java

package com.sdh.complexservice;

import android.os.Parcel;
import android.os.Parcelable;

public class Pet implements Parcelable
{
	private String name;
	private double weight;
	public Pet()
	{
	}
	public Pet(String name, double weight)
	{
		super();
		this.name = name;
		this.weight = weight;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public double getWeight()
	{
		return weight;
	}
	public void setWeight(double weight)
	{
		this.weight = weight;
	}

	
	@Override
	public String toString()
	{
		return "Pet [name=" + name + ", weight=" + weight + "]";
	}
	
	public int describeContents()
	{
		return 0;
	}
	/* (non-Javadoc)
	 * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
	 */
	
	public void writeToParcel(Parcel dest, int flags)
	{
		//把该对象所包含的数据写到Parcel
		dest.writeString(name);
		dest.writeDouble(weight);
	}
	// 添加一个静态成员,名为CREATOR,该对象实现了Parcelable.Creator接口
		public static final Parcelable.Creator<Pet> CREATOR
			= new Parcelable.Creator<Pet>()
		{
			public Pet createFromParcel(Parcel source)
			{
				// 从Parcel中读取数据,返回Person对象
				return new Pet(source.readString()
					, source.readDouble());
			}
			public Pet[] newArray(int size)
			{
				return new Pet[size];
			}
		};

}

5.IPet.aidl,AIDL定义的通信接口

package com.sdh.complexservice;
import com.sdh.complexservice.Person;
import com.sdh.complexservice.Pet;
interface IPet
{
     List<Pet> getPets(in Person owner);
}

6.ComplexService.java,开发的Service类

package com.sdh.complexservice;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

import com.sdh.complexservice.IPet.Stub;

public class ComplexService extends Service
{
	private PetBinder petBinder;
	private static Map<Person,List<Pet>> pets=
			new HashMap<Person,List<Pet>>();
	static
	{
		ArrayList<Pet> list1=new ArrayList<Pet>();
		list1.add(new Pet("旺财",4.3));
		list1.add(new Pet("来福",5.1));
		pets.put(new Person(1,"sun","sun"), list1);
		ArrayList<Pet> list2=new ArrayList<Pet>();
		list2.add(new Pet("kitty",2.3));
		list2.add(new Pet("garfield",3.1));
		pets.put(new Person(2,"bai","bai"), list2);
	}
	public class PetBinder extends Stub
	{
		public List<Pet> getPets(Person owner) throws RemoteException 
		{
			return pets.get(owner);
		}
	}
	@Override
	public IBinder onBind(Intent intent)
	{
		/* 返回catBinder对象
		 * 在绑定本地Service的情况下,该catBinder对象会直接
		 * 传给客户端的ServiceConnection对象
		 * 的onServiceConnected方法的第二个参数;
		 * 在绑定远程Service的情况下,只将catBinder对象的代理
		 * 传给客户端的ServiceConnection对象
		 * 的onServiceConnected方法的第二个参数;
		 */
		return petBinder;
	}
	@Override
	public void onCreate() 
	{
		super.onCreate();
		petBinder=new PetBinder();
	}
	@Override
	public void onDestroy() 
	{
		super.onDestroy();
	}
    
}


7.androidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sdh.complexservice"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service android:name=".ComplexService" >
			<intent-filter>
				<action android:name="org.crazyit.aidl.action.COMPLEX_SERVICE" />
			</intent-filter>
		</service>

        
    </application>

</manifest>


二、开发客户端,新建一个项目:ComplexClient

1.把Person.aidl,Person.java,Pet.aidl,Pet.java,IPet.aidl复制到项目com.sdh.complexservice包下

2.开发ComplexClient这个Activity,在包com.sdh.complexclient包下建ComplexClient.java文件

package com.sdh.complexclient;

import java.util.List;

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.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.sdh.complexservice.IPet;
import com.sdh.complexservice.Person;
import com.sdh.complexservice.Pet;

public class ComplexClient extends Activity 
{
	private IPet petService;
	private Button get;
	EditText personView;
	ListView showView;
	private ServiceConnection conn=new ServiceConnection()
	{
		public void onServiceConnected(ComponentName name, IBinder service) 
		{
			petService=IPet.Stub.asInterface(service);
		}

		public void onServiceDisconnected(ComponentName name) 
		{
			petService=null;
		}		
	};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        get=(Button)findViewById(R.id.button1);
        personView=(EditText)findViewById(R.id.person);
        showView=(ListView)findViewById(R.id.list); 
        Intent intent=new Intent();
        intent.setAction("org.crazyit.aidl.action.COMPLEX_SERVICE" );
        bindService(intent, conn, Service.BIND_AUTO_CREATE);
        get.setOnClickListener(new OnClickListener()
        {
			public void onClick(View v) 
			{
				try
				{
					String personName=personView.getText().toString();
					List<Pet> pets=petService.getPets(
							new Person(1,personName,personName));
					ArrayAdapter<Pet> adapter=new ArrayAdapter<Pet>
					(ComplexClient.this, 
							android.R.layout.simple_list_item_1,pets);
					showView.setAdapter(adapter);
				}
				catch(RemoteException e)
				{
					e.printStackTrace();
				}
			}	
        });
    }
	@Override
	protected void onDestroy() 
	{
		super.onDestroy();
		unbindService(conn);
	}
}


三、效果界面

      先启动ComplexService项目,然后启动ComplexClient项目,看到如下界面:


在文本框中输入bai或者sun时












































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值