這是我整理人家實例,寫出來的。
在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;
}
}
這樣服務端與客戶端都完成了,先運行服務端,然後運行客戶端,點擊按鈕就可以出來相應結果。