既然你已經(jīng)點到這里來了,那么你肯定對aidl有所了解讯泣,什么纫普,aidl是啥你都不知道?好好渠,不要慌局嘁,讀了這篇文章你肯定就懂了。
什么是aidl呢
AIDL是Android Interface Definition Language的縮寫晦墙,見名知意悦昵,Android接口定義語言。嗯晌畅,可我還是不懂什么是接口定義語言但指,用官方的說法是定義客戶端與服務使用進程間通信 (IPC) 進行相互通信時都認可的編程接口,說白了抗楔,其實就是跨進程通信棋凳。
看到這你可能會問,跨進程通信的方式有廣播连躏、ContentProvider剩岳,Messenger,那我為什么要選AIDL呢入热,確實拍棕,Messenger要比aidl使用起來更加簡單,但是aidl的好處用官方原話是:只有允許不同應用的客戶端用 IPC 方式訪問服務勺良,并且想要在服務中處理多線程時绰播,才有必要使用 AIDL。說白了尚困,如果你想要跨應用蠢箩、多線程并發(fā)訪問,aidl是最好的選擇事甜。
進入正題谬泌,沒有什么比一個demo更生動了
通過這個demo了解如何實現(xiàn)跨應用通信
1. 服務端代碼(即提供數(shù)據(jù)給客戶端)
- 先建一個aidl,如圖:
interface MeiNvManager {
void getName();
void getHeight();
void getWeight();
}
然后點一下同步按鈕逻谦,正常的話掌实,會 編譯成java代碼,如圖:(如果沒有生成此java文件跨跨,請看下面)
![K]KM~}R78V%R3R8G}EUD1_2.png](http://upload-images.jianshu.io/upload_images/4126773-bd7d1e60e7d982d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
開始的時候潮峦,我點同步按鈕,這里不會自動生成java代碼勇婴,我也找了很久的原因忱嘹,未果,就將此aidl文件刪掉耕渴,重新創(chuàng)建一個Androidstudio默認創(chuàng)建的aidl文件拘悦,如圖:

然后我再同步一下,自動生成的java文件出現(xiàn)了3髁场4∶住!然后我再刪掉這個aidl文件添诉,建上我需要的MeiNvManager.aidl文件屁桑,同步,bingo栏赴!
然后建一個服務類蘑斧,用于提供數(shù)據(jù)給客戶端:大概的邏輯是沒隔兩秒中對美女賦值。
public class AIDLService extends Service {
public final String TAG = this.getClass().getSimpleName();
MeiNvManager.Stub meiNvManager = new MeiNvManager.Stub() {
@Override
public String getName() throws RemoteException {
return meiNv.name;
}
@Override
public String getHeight() throws RemoteException {
return meiNv.height;
}
@Override
public String getWeight() throws RemoteException {
return meiNv.weight;
}
};
private MeiNv meiNv;
private Handler handler;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return meiNvManager;
}
@Override
public void onCreate() {
super.onCreate();
handler = new Handler();
startChange();
}
private void startChange() {
meiNv = new MeiNv();
meiNv.name = "柳巖";
meiNv.height = "16";
meiNv.weight = "10";
handler.postDelayed(runnable, 2000);
}
Runnable runnable = new Runnable() {
@Override
public void run () {
double random = Math.random();
meiNv.name = "柳巖";
meiNv.height = "16" + (int)(random * 10);
meiNv.weight = "10" + (int)(random * 10);
handler.postDelayed(this,2000);
}
};
}
然后在MainActivity里啟動service:
startService(new Intent(this,AIDLService.class));
當然须眷,不要忘了在Manifest文件里注冊Service:android:process=":remote"和android:exported="true"的作用就是聲明此service為遠程服務竖瘾,并且能用其他應用啟動。
<service android:name=".AIDLService"
android:process=":remote"
android:exported="true">
<intent-filter>
<action android:name="com.example.aidlservice.AIDLService"/>
</intent-filter>
</service>
2. 客戶端代碼(獲取服務端的數(shù)據(jù))
然后我們又建一個module花颗,建一個和服務端一樣的aidl文件捕传,包名也必須一樣,如圖:
然后同步一下扩劝。
在MainActivity里接收服務端的數(shù)據(jù):
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private MeiNvManager meiNvManager;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
meiNvManager = MeiNvManager.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
meiNvManager = null;
}
};
private TextView tv_name;
private TextView tv_height;
private TextView tv_weight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService();
initView();
}
private void initView() {
Button click = (Button) findViewById(R.id.click);
tv_name = (TextView) findViewById(R.id.tv_name);
tv_height = (TextView) findViewById(R.id.tv_height);
tv_weight = (TextView) findViewById(R.id.tv_weight);
click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
String height = meiNvManager.getHeight();
String name = meiNvManager.getName();
String weight = meiNvManager.getWeight();
tv_name.setText(name);
tv_height.setText(height);
tv_weight.setText(weight);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private void bindService() {
Intent intent = new Intent();
//綁定服務端的service
intent.setAction("com.example.aidlservice.AIDLService");
//新版本(5.0后)必須顯式intent啟動 綁定服務
intent.setComponent(new ComponentName("com.example.aidlservice","com.example.aidlservice.AIDLService"));
//綁定的時候服務端自動創(chuàng)建
bindService(intent,conn, Context.BIND_AUTO_CREATE);
}
}
效果如下圖:
到這應該就知道如何去使用了庸论,下一節(jié)我再詳細介紹其原理~