菜鳥初識AIDL進程通信

AIDL:Android Interface Definition Language,即Android接口定義語言。

爲了使其他的應用程序也可以訪問本應用程序提供的服務,Android系統採用了遠程過程調用(Remote Procedure Call,RPC)方式來實現。與很多其他的基於RPC的解決方案一樣,Android使用一種接口定義語言(Interface Definition Language,IDL)來公開服務的接口。我們知道4個Android應用程序組件中的3個(Activity、BroadcastReceiver和ContentProvider)都可以進行跨進程訪問,另外一個Android應用程序組件Service同樣可以。因此,可以將這種可以跨進程訪問的服務稱爲AIDL(Android Interface Definition Language)服務。


那麼該如何實現AIDL通信呢?

首先新建一個.aidl的文件,然後會自動在R文件下生成一個.java的文件,如圖


aidl文件裏面需要定義接口,以供其它進程能夠訪問,

package com.example.animation;

interface service
{
	String getBook();
	String getBookName();
}

然後就是需要新建一個繼承於Service的類,這裏有郭神的Service詳解,http://blog.csdn.net/guolin_blog/article/details/11952435

@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return mBinder;
	}
	service.Stub mBinder=new Stub(){


		@Override
		public String getBook() throws RemoteException {
			// TODO Auto-generated method stub
			return "wo";
		}


		@Override
		public String getBookName() throws RemoteException {
			// TODO Auto-generated method stub
			return "ta";
		}
		
	};
上面這段代碼就是在Service中需要實現的接口,通過Binder機制來實現數據的傳遞,此處有Binder機制的詳解,http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html 


然後就是要在Activity裏面去BindService了,

Button btn;
	private service myAIDLService;
	private MyService.MyBinder  iBinder;
	
	private ServiceConnection connection=new ServiceConnection(){

		@Override
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			
			myAIDLService=service.Stub.asInterface(arg1);
			try{
				String result=myAIDLService.getBook();
				String name=myAIDLService.getBookName();
				Log.i("myServiceActivity", result);
				Log.i("myServiceActivity", name);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			
		}
		
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn=(Button) findViewById(R.id.menu);
		btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent bindIntent=new Intent(MyServiceActivity.this,MyService.class);
				bindService(bindIntent, connection, BIND_AUTO_CREATE);
			}
		});
	}
別忘了,還要註冊哦。



如果想要在其他的應用程序中也要用到這個Service怎麼辦呢,so easy~ 

先把上面.aidl文件生成的R文件的包,拷貝到應用程序的src目錄下


然後,怎麼辦呢,看代碼

Button btn,btn2;
	private service myAIDLService;
	private ServiceConnection connection=new ServiceConnection(){

		@Override
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			
			myAIDLService=service.Stub.asInterface(arg1);
			
		}
		
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			
		}
		
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.menu_layout2);
		btn=(Button) findViewById(R.id.menu2);
		btn2=(Button) findViewById(R.id.menu3);
		btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent bindIntent=new Intent("com.example.animation.service");
				bindIntent.setPackage("com.example.animation");
				bindService(bindIntent, connection, BIND_AUTO_CREATE);
				
			}
		});
		btn2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(myAIDLService==null){
					Log.i("myAIDLService", "null");
					return;
				}
				String result = null;
				String name = null;
				try {
					result=myAIDLService.getBook();
					name = myAIDLService.getBookName();
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				Log.i("myServiceActivity22", result);
				Log.i("myServiceActivity22", name);
			}
		});
	}

好了,基礎的AIDL通信,已經完結了,各位期待,我深入瞭解哦!



 

發佈了24 篇原創文章 · 獲贊 37 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章