該文章只介紹AIDL的使用馆匿,主要是自己平時(shí)工作的一個(gè)總結(jié)抑胎,以防自己忘記。
今天做這樣一件事:
1.建立一個(gè)客戶端
2.再建立一個(gè)服務(wù)端
3.用客戶端來(lái)調(diào)用服務(wù)端的一個(gè)方法輸出一段字符串
這兩個(gè)APP屬于不同的進(jìn)程渐北,如果調(diào)用成功阿逃,則表示順利實(shí)現(xiàn)進(jìn)程之間的通信,別告訴我你不知道 AIDL 是干什么的赃蛛,打死你- -J扬薄!呕臂!
首先看下工程結(jié)構(gòu):
稍作解釋吧破托,后面我會(huì)把代碼地址貼出來(lái)
第一個(gè)app---->是我們的客戶端,下面的那個(gè)myservice---->是我們的服務(wù)端
我們?cè)诳蛻舳说闹兄挥幸粋€(gè)調(diào)用的方法歧蒋,其他的全在服務(wù)端
啰嗦了一堆了土砂,趕緊開始吧。
服務(wù)端
1.首先在我們的項(xiàng)目中谜洽,new一個(gè)新的module萝映,就是我們的myservice這個(gè)myservice就是另一個(gè)程序,所以是在兩個(gè)進(jìn)程
2.在與java同級(jí)目錄中新建一個(gè)AIDL文件阐虚,名字是ICloverInterface,后綴是".aidl",
ICloverInterface.aidl完整代碼(你新建的時(shí)候會(huì)有一個(gè)void的一個(gè)方法序臂,直接無(wú)視就好)
可以發(fā)現(xiàn),這是一個(gè)接口实束,當(dāng)然我們需要在myservice中實(shí)現(xiàn)這個(gè)接口
// ICloverInterface.aidl
package cn.techscan.gd.myservice;
// Declare any non-default types here with import statements
interface ICloverInterface {
String helloWord();
}
這里需要注意一下:這個(gè)接口寫完需要重新build下我們的項(xiàng)目奥秆,
點(diǎn)擊 菜單欄Build ---->Make Moduld'xxx',這時(shí)會(huì)生成這樣一個(gè)文件,下圖
這是一個(gè)接口
3.在myservice實(shí)現(xiàn)這個(gè)接口咸灿,重寫onBind()方法构订,同時(shí),需要在Service中實(shí)現(xiàn)ICloverInterface接口
代碼如下
public class MyHelloService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return iBinder;
}
private ICloverInterface.Stub iBinder = new ICloverInterface.Stub() {
@Override
public String helloWord() throws RemoteException {
return "Hello World";
}
};
}
其中返回的iBinder是我們?cè)诳蛻舳说玫降膶?shí)例析显,return的字符串"Hello World"鲫咽,就是我們需要得到的,如果你需要其他邏輯谷异,就在接口中定義分尸,然后在這里實(shí)現(xiàn)它,都是一樣的歹嘹。
最后箩绍,注意的是:既然我們寫了Service就需要在manifest注冊(cè)
<service android:name=".MyHelloService"
android:exported="true">
</service>
到這我們服務(wù)端就寫完了,很簡(jiǎn)單尺上,就是調(diào)用這里一個(gè)方法材蛛,輸出"hello world"
客戶端
其實(shí)客戶端做的事情也不多圆到,主要就是調(diào)用,
1.首先卑吭,需要把服務(wù)端的aidl文件夾復(fù)制到我們客戶端的同樣的位置下芽淡,就是和java文件夾同級(jí),這里補(bǔ)充下:并不是必須在這里而是我們用AS建立aidl的時(shí)候豆赏,IDE自動(dòng)幫我們創(chuàng)建在這里挣菲,但是兩邊又必須在同樣的結(jié)構(gòu)中,所以這里直接復(fù)制就行掷邦。
結(jié)構(gòu)如下圖:
2.接下來(lái)就需要調(diào)用了白胀,我這里設(shè)置了一個(gè)Button,點(diǎn)擊就打印一個(gè)log抚岗,內(nèi)容是我們需要調(diào)用的"hello word"字符串或杠,代碼如下
public class MainActivity extends AppCompatActivity {
private ICloverInterface mInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindAidlService();
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
String info = mInterface.helloWord();
Log.d("MyApp", "onClick: " + info);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private void bindAidlService() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("cn.techscan.gd.myservice", "cn.techscan.gd.myservice.MyHelloService"));
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mInterface = ICloverInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
先運(yùn)行服務(wù)端,再運(yùn)行客戶端宣蔚,然后點(diǎn)擊button向抢,輸出log
大致就是這么個(gè)流程,底層實(shí)現(xiàn)也不是很清楚件已,后面會(huì)繼續(xù)學(xué)習(xí)笋额,就這樣哈!