【非好文斋配,寫的不對之處歡迎指正」喙耄】
寫在前面:
可能是執(zhí)念在作怪,一直想要自己手寫一個AIDL坏瞄,翻閱網(wǎng)絡(luò)上很多資料桂对,介紹很多,可是就是在敲代碼的時(shí)候遇到一些問題鸠匀,實(shí)在沒辦法就去看文檔敲蕉斜,打算用極其簡單的方式表達(dá)。讓初學(xué)者能用最簡單的方式完成一次不同進(jìn)程間的通信缀棍。
介紹:
https://developer.android.google.cn/guide/components/aidl Developers開發(fā)文檔
AIDL是什么宅此?
官方文檔是這么介紹的:AIDL(Android 接口定義語言)與您可能使用過的其他 IDL 類似。 您可以利用它定義客戶端與服務(wù)使用進(jìn)程間通信 (IPC) 進(jìn)行相互通信時(shí)都認(rèn)可的編程接口爬范。
簡單來講就是不同進(jìn)程進(jìn)行通信的一種手段父腕,在Android開發(fā)過程中,兩個不同的進(jìn)程是不可以互相通信的青瀑,那么我們就可以借助AIDL來實(shí)現(xiàn)兩個進(jìn)程通信璧亮。
說到這里那么我們會問,那么如何來編寫呢斥难?怎么去實(shí)現(xiàn)AIDL呢枝嘶?
首先,我們準(zhǔn)備兩個端哑诊,一個客戶端一個服務(wù)端群扶,這個時(shí)候想要吐槽一下,網(wǎng)上有文章說要兩個端的包名要一樣,起初看到這里愣了很久竞阐。兩個包名一樣缴饭,怎么安裝啊。馁菜。茴扁。。
其次創(chuàng)建AIDL文件
在服務(wù)端創(chuàng)建一個服務(wù)
在客戶端創(chuàng)建服務(wù)器鏈接
以上四個步驟汪疮,完成一個簡單的AIDL操作峭火。
首先創(chuàng)建工程:
創(chuàng)建兩個工程完成之后我們就開始來寫服務(wù)端。
這個時(shí)候需要注意一點(diǎn)智嚷,AIDL能傳遞的參數(shù)
Java 編程語言中的所有原語類型(如
int
卖丸、long
、char
盏道、boolean
等等)String
-
CharSequence
List
中的所有元素都必須是以上列表中支持的數(shù)據(jù)類型稍浆、其他 AIDL 生成的接口或您聲明的可打包類型。 可選擇將List
用作“通用”類(例如猜嘱,List<String>
)衅枫。另一端實(shí)際接收的具體類始終是ArrayList
,但生成的方法使用的是List
接口朗伶。Map
中的所有元素都必須是以上列表中支持的數(shù)據(jù)類型弦撩、其他 AIDL 生成的接口或您聲明的可打包類型。 不支持通用 Map(如Map<String,Integer>
形式的 Map)论皆。 另一端實(shí)際接收的具體類始終是HashMap
益楼,但生成的方法使用的是Map
接口。
這是文檔上的原話点晴。
另外還有一種方式就是實(shí)現(xiàn)Java的序列化:Parcelable
服務(wù)端編寫
首先在項(xiàng)目工程中創(chuàng)建一個AIDL見下圖
// 這個修改掉就好了感凤,改成你想要的名字 ,還會生存一個模板方法粒督,你不需要刪掉就好了
?
// IRemoteServer.aidl
package com.xingge.server;
?
// Declare any non-default types here with import statements
?
interface IRemoteServer {
int handleNoThing(int s);
}
?
/**
我這里很簡單陪竿,沒有考慮到服務(wù)端和客戶端進(jìn)行通行,只是簡單的客戶端開啟服務(wù)端
*/
#### 創(chuàng)建完畢之后記得點(diǎn)下AS上面的錘子坠陈,或者Build-> Make Project萨惑。
完成之后你會發(fā)現(xiàn)在server-Build->generated->source-> 生成一個aidl文件,內(nèi)部有一個IRemoteServer接口 這里面有很多代碼仇矾,這里就不做介紹了庸蔼,想要看的童鞋,可以去看看贮匕,遇到好玩的或者有些坑都可以在下面留言一起進(jìn)步.
接著寫我們的服務(wù)代碼
/**
* 佛曰:
* 寫字樓里寫字間姐仅,寫字間里程序員;
* 程序人員寫程序,又拿程序換酒錢掏膏。
* 酒醒只在網(wǎng)上坐劳翰,酒醉還來網(wǎng)下眠;
* 酒醉酒醒日復(fù)日馒疹,網(wǎng)上網(wǎng)下年復(fù)年佳簸。
* 但愿老死電腦間,不愿鞠躬老板前颖变;
* 奔馳寶馬貴者趣生均,公交自行程序員。
* 別人笑我忒瘋癲腥刹,我笑自己命太賤马胧;
* 不見滿街漂亮妹,哪個歸得程序員衔峰?
* ================================================
* 作 者:Yno (hxx)
* 版 本:
* 創(chuàng)建日期:2018/10/19 10:41
* 包 名: com.xingge.server
* 描 述:
* 修訂歷史:
* ================================================
*/
public class DDService extends Service {
?
@Override
public void onCreate() {
super.onCreate();
System.out.println("DDService onCreate........" + "Thread: " + Thread.currentThread().getName());
}
?
@Nullable
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(this, "服務(wù)器開啟", Toast.LENGTH_SHORT).show();
System.out.println("服務(wù)器開啟");
return mServer;
}
?
// 中間橋梁
private final IRemoteServer.Stub mServer = new IRemoteServer.Stub() {
@Override
public int handleNoThing(int s) throws RemoteException {
return s;
}
};
}
?
// 在AndroidManisfest.xml
<service
android:name=".DDService"
android:enabled="true"
android:exported="true">
?
<intent-filter>
<action android:name="IRemoteServer" />
</intent-filter>
</service>
是不是很簡單佩脊,服務(wù)端代碼就寫好了。 Activity里面不做任務(wù)操作垫卤。
客戶端
上面完成服務(wù)端威彰,下面我們就來完成下客戶端代碼。
再次之前穴肘,我們需要了解那些知識內(nèi)容呢抱冷?
- Android兩種啟動服務(wù)的方式 // https://developer.android.google.cn/guide/components/bound-services#Binding
不了解的可以根據(jù)上面的地址詳細(xì)的看下。
客戶端同樣的需要創(chuàng)建一個AIDL文件梢褐,要保證AIDL文件和服務(wù)端的AIDL相同,你也可以直接拷貝過去赵讯,不過需要注意一點(diǎn)盈咳。
加紅標(biāo)注的位子是你需要注意的,這個報(bào)名要注意更改边翼。和當(dāng)前項(xiàng)目的包名是一至的鱼响。到這一步和服務(wù)端創(chuàng)建的時(shí)候是相同的。沒什么區(qū)別组底,就不在做詳細(xì)的講解了丈积。
客戶端代碼
public class MainActivity extends AppCompatActivity {
private Button button;
// 獲取進(jìn)程橋梁對象
private IRemoteServer mServer;
// 創(chuàng)建服務(wù)鏈接
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(MainActivity.this, "Service connected", Toast.LENGTH_SHORT).show();
// 初始化。
mServer = IRemoteServer.Stub.asInterface(service);
}
?
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(MainActivity.this, "Service disconnected", Toast.LENGTH_SHORT).show();
// 服務(wù)關(guān)閉
mServer = null;
}
};
?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
?
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
Intent intent = new Intent(IRemoteServer.class.getName());
intent.setClassName("com.xingge.server", "com.xingge.server.DDService");
// 進(jìn)行綁定债鸡。
bindService(intent, mConnection, BIND_AUTO_CREATE);
}
});
}
}
這樣一個簡單的進(jìn)程通信就完成了江滨。
上面就是軟件演示圖了。厌均。唬滑。OVER。
?