Android中的程序之間的通訊

2021-07-10 17:42:40 字數 3833 閱讀 1391

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 中有...