Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 最簡單的Android Aidl 使用

最簡單的Android Aidl 使用

編輯:關於Android編程

首先,為什麼要用aidl

---------------------------------------------------------------------------------------------------------------------------

aidl其實就是進程間的通信

官方文檔特別提醒我們何時使用AIDL是必要的:只有你允許客戶端從不同的應用程序為了進程間的通信而去訪問你的service,以及想在你的service處理多線程。如果不需要進行不同應用程序間的並發通信(IPC),you should create your interface by implementing a Binder;或者你想進行IPC,但不需要處理多線程的,則implement your interface using a Messenger
簡單說就是,1、你某個service想被別人使用;2、你想使用其它進程的service
然後,怎麼用aidl(一下是一個最簡單的使用,從服務端獲取一個字符串) ------------------------------------------------------------------------- 步驟: 服務端 1、在服務程序端建立xxx.aidl文件,裡面放接口(這個接口要與文件名稱一樣),寫法跟寫Java程序一樣 2、新建一個Service,這個Service裡面實現之前那個aidl文件裡面的接口 3、manifest.xml文件注冊Service client端 1、copy之前的那個aidl文件過來(要獨立一個跟服務端文件夾相同名字的文件夾,否則會報錯最後面的那個錯誤) 2、在activity裡面初始化ServiceConnection(用來bind Service的),和獲得服務端的service 服務端的service = 接口.Stub.asInterface(service);//在ServiceConnection的onServiceConnected裡面實現 3、bindService
實現代碼: 先看一下目錄結構 \

ExecuteMyAidlService.aidl文件(注意接口名稱要與文件名前邊相同)
package aid;
interface ExecuteMyAidlService { 
	
	String sayHello();
	
}
MyAidlService.java文件
package aidlservice;

import aid.ExecuteMyAidlService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;


public class MyAidlService extends Service
{
	private static final String TAG = "MyAidlService"; 
	private ExecuteMyAidlService.Stub mBinder = new ExecuteMyAidlService.Stub() {

		@Override
		public String sayHello() throws RemoteException {
			// TODO Auto-generated method stub
			return "hello ";
		}
    	
    };
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return mBinder;
	}

	private void Log(String str) {  
        android.util.Log.d(TAG, "------ " + str + "------");  
    }  
    @Override  
    public void onCreate() {  
        Log("service create");  
    }  
    @Override  
    public void onStart(Intent intent, int startId) {  
        Log("service start id=" + startId);  
    }  
    
    
}
activity裡面沒有東西就不貼了
客戶端的目錄結構 \


ClientActivity的代碼:
package com.example.aidlclienttest;

import aid.ExecuteMyAidlService;
import android.support.v7.app.ActionBarActivity;
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.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class ClientActivity extends ActionBarActivity {

	 private ExecuteMyAidlService mIaidlServerService = null;  
	 private TextView mTextView = null; 
	 private Button mButton = null;
	 private ServiceConnection mConnection = new ServiceConnection() {
	          
	        public void onServiceDisconnected(ComponentName name) {  
	            mIaidlServerService = null;  
	        }     
	        public void onServiceConnected(ComponentName name, IBinder service) {  
	            mIaidlServerService = ExecuteMyAidlService.Stub.asInterface(service);  
	            //aidl通信  
	            try {  
	            	String mText = "Say hello: " + mIaidlServerService.sayHello();
	            	mTextView.setText(mText);
	            } catch (RemoteException e) {  
	                e.printStackTrace();  
	            }  
	        }  
	    };  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client);
        mTextView = (TextView)findViewById(R.id.helloword);
        mButton = (Button)findViewById(R.id.getServiceFromAidl);
        mButton.setOnClickListener(new OnClickListener(){

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.client, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

這裡就實現了最簡單的aidl通信的過程 看一下效果 先開啟服務端 \

然後再啟動client端,點擊bindservice之後

\

進階aidl<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPgo8c3Ryb25nPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvc3Ryb25nPgoxoaLI57n7ztLP67TTc2VydmljZbvxyKG21M/zxNijv6Oo1+7SqtOm08OjqQq9q7bUz/PKtc/WcGFyY2VsYWJsZSC907/aCiAgICDOqtXiuPa21M/z0LS49mFpZGzOxLz+W8Dvw+bWu9Do0qq2qNLl0rvPwtXiuPa21M/zvs3Q0MHLyOc6XQo8c3Ryb25nPjwvc3Ryb25nPjxwcmUgY2xhc3M9"brush:java;"> parcelable Object
2、如果activity要往service裡面傳遞數據呢? 【如果是對象一樣是要parcelable,(因為client和server的aidl文件是一樣的)】 要在接口函數那裡加上in 基本類型(int,long,char,boolean等),String,CharSequence,List,Map,其他類型必須使用import導入,即使它們可能在同一個包裡,比如 上面的Student,盡管它和IMyService在同一個包中,但是還是需要顯示的import進來。
另外,接口中的參數除了aidl支持的類型,其他類型必須標識其方向:到底是輸入還是輸出抑或兩者兼之,用in,out或者inout來表示,一般 in標記,因為大多數情況下輸入型參數。

過程中碰到的錯誤

------------------------------------------------------------------------------------------------------------------------------------------------

java.lang.SecurityException: Binder invocation to an incorrect interface

在service端和client端都有.aidl文件,一定要放在單獨的包中,因為兩個app中的MainActivity的包名不相同,會導致兩個.aidl文件內容不同。單獨一個包,只放.aidl文件,就能保證包名和文件內容都是相同的。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved