編輯:關於Android編程
AIDL (Android Interface Definition Language), Android接口定義語言,Android提供的IPC (Inter Process Communication,進程間通信)的一種獨特實現。
使用AIDL只有在你允許來自不同應用的客戶端跨進程通信訪問你的service,並且想要在你的service種處理多線程的時候才是必要的。 如果你不需要執行不同應用之間的IPC並發,你應該通過實現Binder建立你的接口,或者如果你想執行IPC,但是不需要處理多線程。那麼使用Messenger實現你的接口。
必須在一個.aidl文件中使用java編程語言語法定義你的AIDL接口,然後在提供service的應用中和任何綁定到這個service的應用中的源代碼中(在src目錄嚇)保存它。
當你編譯包含.aidl文件的應用時,Android SDK工具基於這個.aidl文件生成一個IBinder接口,並且把它保存到項目的gen目錄嚇.service必須恰當的實現這個IBinder接口 之後客戶端應用可以綁定到這個服務上,然後從IBinder調用方法來執行IPC。
使用AIDL建立一個鄰接的service需要遵循下面的步驟:
1. 建立.aidl文件
這個文件使用方法簽名定義了語言接口
2.實現這個接口
Android SDk工具基於你的.aidl文件使用java語言生成一個接口 這個接口有一個內部抽象類,叫做Stub,它是繼承Binder並且實現你AIDL接口的 你必須繼承這個Stub類並且實現這些方法
3.暴露這個接口給客戶端
實現一個service並且覆蓋onBind()方法返回你的Stub實現類。
你的.aidl文件必須被復制到其他應用程序中來讓他們訪問你service的接口,你必須維護原始接口的支持(向後兼容)。
AIDL使用一個簡單的語法讓你聲明一個帶有一個或者多個帶有參數和返回值方法的接口 參數和返回值可以是任何類型,甚至是AIDL生成的接口。
IService.aidl
package com.example.aidl;
interface IService {
String hello(String name);
}
當你編譯你的應用時,Android SDK工具生成一個.java接口文件用你的.aidl文件命名生成的接口包含一個名字為Stub的子類,這是一個它父類的抽象實現,並且聲明了.aidl中所有的方法。
Stub也定義了一些輔助的方法,最顯著的就是asInterface(),它是用來接收一個IBinder(通常IBinder傳遞給客戶端的onServiceConnected()回調方法)並且返回一個Stub接口的實例 。
一旦你為service實現了接口,你需要把它暴露給客戶端,這樣他們才能綁定到上面 為了給你的service暴露接口,繼承Service並且實現onBind()方法返回一個你實現生成的Stub類。
AIDLService.java
public class AIDLService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
// Return the interface
return new IService.Stub() {
@Override
public String hello(String name) throws RemoteException {
// TODO Auto-generated method stub
return "hello"+name;
}
};
}
MainActivity.java<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
public class MainActivity extends Activity {
IService RemoteService; //監聽服務
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Log.i("mConnection", service+"");
RemoteService = IService.Stub.asInterface(service);
try {
String s= RemoteService.hello("finch");
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initService();
}
//連接服務
private void initService() {
Intent i = new Intent( );
i.setAction("android.intent.action.AIDLService");
boolean ret = bindService(i, mConnection, Context.BIND_AUTO_CREATE);
}
//斷開服務
private void releaseService() {
unbindService(mConnection);
mConnection = null;
}
@Override
protected void onDestroy() {
super.onDestroy();
releaseService();
}
}
運行結果:
sina刷新 這種下拉刷新的方式是比較簡單的。上個圖: 這種刷新方式的思路是這樣的: 首先是需要一個HeaderVIew也就是刷新時頭部所顯示出來的數據。這個view的
大家可能在做app的時候,或多或少需要使用聯系人,而根據google提供的api,你需要編寫大量的代碼,例如首先需要查詢數據庫,涉及到數據庫表和字段以及對應的SQL語句。
UI編程通常都會伴隨事件處理,Android也不例外,它提供了兩種方式的事件處理:基於回調的事件處理和基於監聽器的事件處理。對於基於監聽器的事件處理而言,主要就是為And
1.定義廣播接收,顯示電池信息--BatteryInfoBroadcastReceiver package org.lxh.demo; import a