1.廣播
廣播是比較常用的程序間通訊的方式,而且實現起來也比較簡單
缺點:某些手機對於靜態註冊的廣播的傳送和接收延遲非常嚴重,例如一些配置很低的手機,華碩,聯想的部分低配手機就對靜態註冊的廣播有較長的延遲,我曾經遇到過的有延遲1到2分鐘的;廣播的資料傳輸是有限的,如果傳輸的資料量太大會報錯
2.aidl
package com.xtc.sync;
import com.xtc.sync.iclosecallback;
// declare any non-default types here with import statements
inte***ce iconnectionservice
inte***ce imyaidlinte***ce
表示int,long,boolean,float,double,string就可以直接傳遞,不需要加修飾符,當然double部資料簡單資料型別
缺點:aidl介面不夠靈活,如果要傳複雜的資料物件很麻煩,要定義對應的aidl介面,而且在兩個程序之中都要定義才行,更重要的是aidl介面不穩定,因為service有可能被系統殺死,這時候service就是停止狀態,然而要是這時候程式呼叫aidl介面就會報deadobjectexception異常;會報空指標錯誤:
/**
* 傳送資料
*/@override
public
intsend(byte data) throws android.os.remoteexception
finally
return _result;
}
這段**是前面定義的send()的aidl介面編譯後自動生成的乙個類,有時候就會報__reply.readexception()是nullpointerexeception,解決方案:
@override
public
boolean
ontransact(int code, parcel data, parcel reply, int flags) throws remoteexception catch(runtimeexception e)
}}
捕獲aidl異常,然後檢視log分析到底是那一句報錯,aidl介面定義好了之後就在service裡面建乙個內部累,整合aidl的sub:
private
class
connectionbinder
extends
iconnectionservice.stub
@override
public
intsend(byte data) throws remoteexception
@override
public
void
heartbeat() throws remoteexception
@override
public
void
close() throws remoteexception
@override
public
void
closeforback(iclosecallback iclosecallback) throws remoteexception
@override
public
boolean
isclose() throws remoteexception
@override
public
void
initserverinfo(string serverinfo) throws remoteexception
@override
public
void
switchhost() throws remoteexception
@override
public
boolean
ontransact(int code, parcel data, parcel reply, int flags) throws remoteexception catch(runtimeexception e)
}}
這個就是提供給ingyige程序呼叫的遠端介面了,而且在onbind()方法裡面要反悔這個binder:
@override
public ibinder onbind(intent intent)
然後在另乙個程序實現serviceconnection中的兩個方法:
public
final
class
iconnserviceconnection
implements
serviceconnection
@override
public
void
onservicedisconnected(componentname name)
connectionservice 物件才是真正可以呼叫剛才定義的哪些aidl介面的物件,它就相當於外部程序和service之際嗯的橋梁,最後在startservice,bindservice就可以正常呼叫aidl介面了
3.localsocket和localserversocket
這兩個可實現和c程序的通訊,比較靈活,因為資料傳輸是流式傳輸,用法和socket,serversocket比較像,但是內部實現原理和socketserversocket就差很多了,雖然是好用,但是貌似呼叫close()方法的時候並不能像socket那樣直接就丟擲異常,例如:
private
void
startlocalclient() throws ioexception else }}
synclogutil.w("localpush", "local connect client readlength:" + readlength);
buffer.reset();
}
這裡客戶端的localsocket如果呼叫close()方法或者呼叫localsocket.getinputstream().close()程式並不會丟擲ioexeception,而是繼續堵在read()方法,這樣就會造成執行緒一直阻塞,執行緒isalive()返回的是true,執行緒資源垡釋放,localserversocket也是同樣的問題,我嘗試在呼叫close()方法後不斷的呼叫localsocket和localserversocketwrite資料,這樣執行緒就能正常丟擲異常然後結束,而且在localserversocket初始化後會繫結到乙個位址,呼叫close()之後並不會釋放這個位址,此時再次繫結這個位址會報address already used,但是在呼叫了localserversocket的close()方法之後再次連線乙個localsocket進來,是可以正常連上的,不過此時localserversocket已經把繫結的位址釋放了,而且也不能喜劇讀取和寫入資料了,這時候再次初始化乙個localserversocket丙丁島相同的位址就能繫結成功,但是你要是new乙個localsocket,寫完資料後立即關閉,那這時候客戶端的就不會造成阻塞,會正常丟擲io異常,執行緒結束,關於localsocket和localserversocket的正確用法還要繼續研究,主要難點就是當讀取等待的執行緒不用了,怎麼才能成功close掉,這樣才能成功釋放執行緒資源,待補充。。。
直接用本地的tcp:socket和serversocket
直接用本地udp
因為本地udp資料傳輸並不用ping到網路上,都是本地發包與收包,因此丟包的概率大大降低了,而且效率也比tcp資料傳輸高
程序之間的死鎖
宣告 本文並未給出程序死鎖的解決方案!有兩個程序p1和p2,兩個資源 資源a和資源b。p1需要這兩個資源,同時p2也需要這兩個資源。p1申請a資源的同時p2申請了b資源,此時兩個程序都成功申請了資源。但在 p1申請b資源時因為b資源剛被p2占用,因此申請失敗,處於阻塞狀態。p2在申請a資源時同樣因a...
Android的Activity之間的通訊
為了方便描述,我們將啟動另外乙個activity 的那個activity 叫做主activity,被啟動的那個activity,叫做子activity。主activity 和子acitivity 之間進行通訊的方法有很多種,下面介紹簡單的方法。通過intent 來進行引數的傳遞。在intent 中有...
Android的Activity之間的通訊
為了方便描述,我們將啟動另外乙個activity 的那個activity 叫做主activity,被啟動的那個activity,叫做子activity。主activity 和子acitivity 之間進行通訊的方法有很多種,下面介紹簡單的方法。通過intent 來進行引數的傳遞。在intent 中有...