組件的特點(diǎn)
對于Android的四大組件Activity, Service, ContentProvider和Service,不能有Setter和Getter,也不能給組件添加接口。原因是組件都是給系統(tǒng)框架調(diào)用的,開發(fā)者只能實(shí)現(xiàn)其規(guī)定的回調(diào)接口,組件的創(chuàng)建與銷毀都是由系統(tǒng)框架控制的,開發(fā)者不能強(qiáng)行干預(yù),更沒有辦法獲取組件的對象。比如Activity,Service,BroadcastReceiver,你沒有辦法去創(chuàng)建一個Activity,Service或BroadcastReceiver,然后像使用其他類那樣的調(diào)用其上的接口與其通信,用Setters和Getters改變屬性等等。這也決定了,組件之間通信只能用系統(tǒng)支持的Intent。而Intent只能傳遞基本數(shù)據(jù)類型和Uri等一些常見的數(shù)據(jù)類型。Intent只支持傳遞內(nèi)置類型和一些限制類型,這就導(dǎo)致了組件之間的數(shù)據(jù)傳遞必須都是基本類型,所以枚舉類型無法使用。
多態(tài)無法實(shí)現(xiàn)
比如你有一個Service用于在后臺執(zhí)行UI中發(fā)來的請求,這些請求有些是做數(shù)據(jù)請求,有些是做數(shù)據(jù)分析,等等。這里可以用多態(tài),定義一個統(tǒng)一的Transaction類,然后再為每種特定的Transaction類型,Transaction中統(tǒng)一接口process()用于實(shí)際的處理,理想的情況是,Service接收一個Transaction對象,然后調(diào)用其process(),沒有必要知道具體的類型,UI創(chuàng)建具體的一個類型對象然后交由Service來處理。但是這在Android當(dāng)中是無法實(shí)現(xiàn)的,因?yàn)镮ntent通信機(jī)制所限,因?yàn)樗荒苤苯觽鬟fTransaction對象。所以,Service必須要知道具體的類型。原生應(yīng)用Mms中就有如此的現(xiàn)象,在transaction包中TransactionService是處理服務(wù),UI發(fā)送到Service的只是區(qū)別不同Transaction的Id(一個整數(shù)),Service查看不同的Id創(chuàng)建不同的Transaction對象,然后調(diào)用process()對其處理。
建議:自己實(shí)現(xiàn)一個類似Service的服務(wù)類,在其內(nèi)用Handler,Thread和Looper讓其長時間運(yùn)行。這樣就沒有組件間通信的限制,你可以像正常使用Java對象那樣來使用這個服務(wù)類,向其傳遞自定義的處理請求:
public void execute(Transaction request) {
if (mHandler == null) {
return;
}
Message msg = Message.obtain();
msg.obj = request;
mHandler.sendMessage(msg);
}
}
新聞熱點(diǎn)
疑難解答
圖片精選