編輯:關於Android編程
AIDL:Android Interface Definition Language,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口。
ICP:Interprocess Communication ,內部進程通信。
使用:
1、先創建一個aidl文件,aidl文件的定義和java代碼類似,但是!它可以引用其它aidl文件中定義的接口和類,但是不能引用自定義的java類文件中定義的接口和類,要引用自定義的接口或類,需要為此類也定義一個對應的aidl文件,並且此類要實現Parcelable接口,同時aidl文件和類文件必須要在相同包下進行聲明;Android包含了aidl編譯器,當定義好一個aidl文件的時候,會自動編譯生成一個java文件,此文件保存在gen目錄之下。
在這個項目中,定義了兩個aidl文件,其中Person實現了接口Parcelable,下面是這兩個aidl文件的定義:
Person.aidl
{
parcelable Person;
}
IAIDLServerService.aidl
{
package com.webview;
import com.webview.Person;// 引用上面的Person.aidl
interface IAIDLServerService{
String sayHello();
Person getPerson();
}
}
2、編寫一個Service實現定義aidl接口中的內部抽象類Stub,Stub繼承自Binder,並繼承我們在aidl文件中定義的接口,我們需要實現這些方法。Stub中文意思存根,Stub對象是在服務端進程中被調用,即服務端進程。
在客戶端調用服務端定義的aidl接口對象,實現Service.onBind(Intent)方法,該方法會返回一個IBinder對象到客戶端,綁定服務時需要一個ServiceConnection對象,此對象其實就是用來在客戶端綁定Service時接收Service返回的IBinder對象。
||public static abstract class Stub extends android.os.Binder implements com.webview.IAIDLServerService
public class AIDLServerService extends Service{@Overridepublic IBinder onBind(Intent intent) {return binder;}private IAIDLServerService.Stub binder = new Stub() {@Overridepublic String sayHello() throws RemoteException {return "Hello AIDL";}@Overridepublic Person getPerson() throws RemoteException {Person person = new Person();person.setName("Livingstone");person.setAge(22);return person;}};}
3、在服務端注冊Service,將如下代碼添加進Application節點之下!
<service android:name="com.webview.AIDLServerService"
android:process=":remote">
<intent-filter>
<action android:name="com.webview.IAIDLServerService"></action>
</intent-filter>
</service>
至此,服務端進程定義已經完成!
4、編寫客戶端,注意需要在客戶端存一個服務端實現了的aidl接口描述文件,客戶端只是使用該aidl接口,獲取服務端的aidl對象(IAIDLServerService.Stub.asInterface(service))之後就可以調用接口的相關方法,而對象的方法的調用不是在客戶端執行,而是在服務端執行。
public class MainActivity extends Activity {private Button btn;private IAIDLServerService aidlService = null;
private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {aidlService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {aidlService = IAIDLServerService.Stub.asInterface(service);try {aidlService.doFunction();// 執行接口定義的相關方法} catch (RemoteException e) {e.printStackTrace();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.button);tv = (TextView) findViewById(R.id.textview);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent service = new Intent("com.webview.IAIDLServerService");bindService(service, conn, BIND_AUTO_CREATE);// 綁定服務}});}}
客戶端目錄結構:
這篇文章主要介紹一下如何實現View的3D旋轉效果,實現的主要原理就是圍繞Y軸旋轉,同時在Z軸方面上有一個深入的縮放。演示的demo主要有以下幾個重點: 1,自定義旋轉動
今天是放完假後工作的第一天,為了證明我不是一段幽靈代碼,我給各位看客老爺們說句:祝大家節日過得愉快(過得不愉快那也是人之常情)。我們繼續來講一講ListView的開發,
現在Android的開發者基本上都使用Android Studio進行開發(如果你還在使用eclipse那也行,畢竟你樂意怎麼樣都行)。使用好Android Studio
android的輸入管理系統主要完成按鍵、觸摸板、鼠標等輸入設備的事件輸入,功能包括,輸入設備的事件輸入及向焦點窗口和焦