AIDL實現進程間通信(整理)

這是我整理人家實例,寫出來的。

在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;
    }
}

這樣服務端與客戶端都完成了,先運行服務端,然後運行客戶端,點擊按鈕就可以出來相應結果。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章