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