您的位置:首页 > 大数据 > 人工智能

AIDL实现进程间通信(整理)

2015-01-20 17:50 239 查看
这是我整理人家实例,写出来的。

在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成。主要是通过AIDL文件的描述信息,eclips开发工具会生成相应的java代码。在用的时候,我们去调用这个代码就可以了。

即然是进程间的通信,它就应该有两个app程序,其中一个访问另一个。下面分为服务端和客户端还写,知识点不是很详尽,只暂时留个影象。

AIDLServer端



编辑Book.aidl文件内容如下

parcelable Book;
编辑Book.java文件内容如下

package com.jackchan.aidlserver;

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;
}
@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.writeString(bookName);
dest.writeInt(bookPrice);
}

public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>(){

@Override
public Book createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new Book(source);
}

@Override
public Book[] newArray(int size) {
// TODO Auto-generated method stub
return new Book[size];
}

};
}
编辑IAIDLServerService.aidl文件如下

package com.jackchan.aidlserver;

import com.jackchan.aidlserver.Book;
interface IAIDLServerService{
String sayHello();

Book getBook();
}
这个文件编辑完成后,可以在gen目录下看到生成出来的相应的java文件.

编辑AidlServerService.java文件如下

package com.jackchan.aidlserver;

import com.jackchan.aidlserver.IAIDLServerService.Stub;

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 arg0) {
// TODO Auto-generated method stub
return mBinder;
}

private IAIDLServerService.Stub mBinder = new Stub(){

@Override
public String sayHello() throws RemoteException {
return "Hello";
}

@Override
public Book getBook() throws RemoteException {
Book mBook = new Book();
mBook.setBookName("Android应用开发");
mBook.setBookPrice(50);
return mBook;
}
};
}
最后还要编辑AndroidManifest.xml文件内容,这个一定不能忘,也就是客户端会根据这个去连接服务端

<service android:name=".AidlServerService"
android:process=":remote">
<intent-filter>
<!--  <action android:name="com.jackchan.aidlserver.IAIDLServerService"></action> -->
<action android:name="com.jackchan.aidlserver.aaaa"></action>
</intent-filter>
</service>
action中的android:name中的内容可以自己定义一个,客户端连接的时候与之保持一致即可。

整个服务端就完成了。

AIDLClient客户端



首先把Book.java Book.aidl IAidlServerService.aidl文件拷贝到客户端。然后再编辑AIDLClientActivity.java文件即可。

AIDLClientActivity.java文件内容如下

package com.jackchan.aidlclient;

import com.jackchan.aidlserver.IAIDLServerService;

import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
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 mIaidServerService = null;

private ServiceConnection mConnection = new ServiceConnection(){

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub

mIaidServerService = IAIDLServerService.Stub.asInterface(service);
try{
String mText = "Say Hello:" + mIaidServerService.sayHello() + "\n";
mText += "书名:" + mIaidServerService.getBook().getBookName() + "\n";
mText += "价格:" + mIaidServerService.getBook().getBookPrice();
mTextView.setText(mText);
}
catch(RemoteException e){
e.printStackTrace();
}
}

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mIaidServerService = null;
}

};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aidlclient);

mTextView = (TextView)findViewById(R.id.textview);
mButton = (Button)findViewById(R.id.button);

mButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent service = new Intent("com.jackchan.aidlserver.aaaa");
bindService(service, mConnection, BIND_AUTO_CREATE);
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.aidlclient, menu);
return true;
}
}


这样服务端与客户端都完成了,先运行服务端,然后运行客户端,点击按钮就可以出来相应结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: