`
hyshucom
  • 浏览: 808427 次
文章分类
社区版块
存档分类
最新评论

Android高手进阶教程(二十五)之---Android 中的AIDL!!!

 
阅读更多

大家好,好久不见,今天要给大家分享的是android aidl的使用。在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.
AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

今天的两个实例用到两个Android工程,一个是AIDL的服务端另一个是客户端。

服务端的实现步骤:

首先看一下服务端,工程目录如下:

首先创建IaidlServerService.aidl文件,代码如下(一个简单方法,另一个返回对象方法),当我们点击保存时会在gen目录下生成对应的java文件,如上图红色部分:

package com.chapter8.aidl;
import com.chapter8.aidl.Book;
interface IAIDLServerService { 
	
	String sayHello();
	
	Book getBook();
}

第二步:因为这个接口里有传递对象,所以对象要特殊处理一下,这里继承了Parcelable,Book.java代码如下:

如果大家不明的地方,请参见,下面连接的文章:

Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!

package com.chapter8.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable {
	
	private String bookName;
	private int bookPrice;
	
	public Book(){
		
	}
	
	public Book(Parcel parcel){
		bookName = parcel.readString();
		bookPrice = parcel.readInt();
	}
	
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public int getBookPrice() {
		return bookPrice;
	}
	public void setBookPrice(int bookPrice) {
		this.bookPrice = bookPrice;
	}
	
	public int describeContents() {
		return 0;
	}
	public void writeToParcel(Parcel parcel, int flags) {
		parcel.writeString(bookName);
		parcel.writeInt(bookPrice);
	}
	
	public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
		public Book createFromParcel(Parcel source) {
			
			return new Book(source);
		}
		public Book[] newArray(int size) {
			return new Book[size];
		}
	};
}

第三步:写一个与Book类对应的aidl,命名为Book.aidl,代码非常简单,代码如下:
parcelable Book;

第四步:新建一个名为AidlServerService的Service.代码如下:

package com.chapter8.aidl;
import com.chapter8.aidl.IAIDLServerService.Stub;
import com.chapter8.aidl.IAIDLServerService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class AidlServerService extends Service {
	@Override
	public IBinder onBind(Intent intent) {
		return mBinder;
	}
	/**
	 * 在AIDL文件中定义的接口实现。
	 */ 
	private IAIDLServerService.Stub mBinder = new Stub() {
		
		public String sayHello() throws RemoteException {
			return "Hello";
		}
		
		public Book getBook() throws RemoteException {
			Book mBook = new Book();
			mBook.setBookName("Android应用开发");
			mBook.setBookPrice(50);
			return mBook;
		}
	};
}

第五步:在AndroidManifest.xml注册Service,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.chapter8.aidl"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name="AidlServerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
		<service android:name="AidlServerService"
				 android:process=":remote">
			<intent-filter>
        		<action android:name="com.chapter8.aidl.IAIDLServerService"></action>
    		</intent-filter>
		</service>
    </application>
</manifest>

第六步:运行服务端工程,到设备上,好让客户端调用,服务端的Activity什么都没做.效果如下:

客户端的具体实现步骤:

第一步:新建客户端工程,目录结构如下:

第二步:引入Aidl文件以及用到的类,如上面的com.chapter8.aidl包。直接从服务端里代码copy过来就OK.

第三步:修改main.xml布局文件,增加一个按钮,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
	android:id="@+id/textview"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button
	android:id="@+id/button"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text="调用AIDL服务"
	/>
</LinearLayout>

第四步:修改AidlClientActivity.java代码如下:

package com.chapter8.aidlclient;
import com.chapter8.aidl.IAIDLServerService;
import android.app.Activity;
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.TextView;
public class AidlClientActivity extends Activity {
 
	private TextView mTextView;
	private Button mButton;
	
	private IAIDLServerService mIaidlServerService = null;
	
	private ServiceConnection mConnection = new ServiceConnection() {
		
		public void onServiceDisconnected(ComponentName name) {
			mIaidlServerService = null;
		}	
		public void onServiceConnected(ComponentName name, IBinder service) {
			mIaidlServerService = IAIDLServerService.Stub.asInterface(service);
			//aidl通信
			try {
				String mText = "Say hello: " + mIaidlServerService.sayHello() + "/n";
				mText += "书名: " + mIaidlServerService.getBook().getBookName()+"/n";
				mText += "价格: " + mIaidlServerService.getBook().getBookPrice();
				mTextView.setText(mText);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}
	};
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
        //初始化控件
        mTextView = (TextView)findViewById(R.id.textview);
        mButton = (Button)findViewById(R.id.button);
        //增加事件响应
        mButton.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
                //bindService
				Intent service = new Intent("com.chapter8.aidl.IAIDLServerService");
				bindService(service, mConnection,BIND_AUTO_CREATE);							
			}
        	
        });
    }
    
    
}

第五步:运行客户端工程,效果如下:

Ok,上面就完整的作了一个Aidl开发的流程,有什么不对的地方希望大家多多指教,今天就讲到这里。谢谢!


分享到:
评论

相关推荐

    【读博笔记】读《 Android高手进阶教程(二十五)之---Android 中的AIDL!!! 》笔记对应代码

    本代码是我个人笔记对应的代码,请与文章对应查看。

    老罗android开发视频教程全集百度网盘下载

    Android进阶高级:蓝牙/WIFI SMS/MMS 应用实现 深层次解析GPS原理,实现LocationManager/LocationProvider 进行定位/跟踪/查找/趋近警告以及Geocoder正逆向编解码等技术细节 2D图形库(Graphics/View)详解 SDCARD/...

    Android AIDL示例代码.zip

    Android AIDL示例代码, 包含了各种示例、解释等等,值得下载。

    Android高级编程--源代码

    在每章的讲解中,它会让你通过一系列示例项目逐步掌握Android中的各种新功能和技术,助你取得最圆满的学习效果。本书所介绍的各个应用实例简明扼要且极具实用价值,它们覆盖了Android 1.0的所有基本功能和高级功能...

    android开发资料大全

    Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程 Android应用开发者指南:性能优化 android开发教程合集(推荐新手看下这一季教程) 新手入门 会员贡献电子图书整理(内含PDF下载) ...

    aidl实现跨进程通信Demo(进阶版)

    Android利用Aidl实现跨进程通信并传递数据的Demo

    Android开发艺术探索

    《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些...

    国内面试leetcode-Android-Interview:Android-面试

    一个很棒的安卓专家面试题和答案 历时6个多月,从十多个顶级面试库和...7、Android进阶:进程间通信、Binder、AIDL、AMS/WMS、事件分发、滑动冲突、View绘制流程、性能优化、重要Android源代码和开源库分析。 8、Andr

    Android开发艺术探索.任玉刚(带详细书签).pdf

    本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层...

    android开发艺术探索高清完整版PDF

    《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些...

    android demo

    android aidl demo

    Android音乐播放器实例教学Demo

    仿某知名音乐播放器的Android版本app Demo+源码,适合新手和进阶人员使用同时学习代码

    leetcode下载-Android_Interviews:Android_Interviews

    7、Android进阶:进程间通信、Binder、AIDL、AMS/WMS、事件分发、滑动冲突、View的绘制流程、性能优化、重要的Android源码和开源库分析等等。 8、Android高新技术:模块化、插件化、组件化、热更新实现原理等等。 9...

    Android IPC机制绑定Service实现本地通信

    **写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过程中的一些理解。 这一章是为下面的Messenger和AIDL的使用做准备,主要讲解Android Service的...

Global site tag (gtag.js) - Google Analytics