簡而言之,Android可以並且將會殺死任何佔用資源以保持運行的應用程序。 onus在你關於如何處理可能威脅你的應用程序被殺死的場景。
我建議看看developer的網站上發現的服務的生命週期。
首先,任何應用程序,無論是服務/活動,這種方式太多了,以這種方式被認爲... ...在Android的眼中「粗魯」,因此,準備在這個死亡方式不管!
例如,在onLowMemory
中監聽覆蓋方法,並相應地採取行動,例如保存數據和缺陷。
真正,應該發生,是這樣的,服務,產生一個線程來定期監聽以這種方式傳入連接,
while (!terminating){
Socket incomingClientSocket = ourServerSocket.accept();
// How you handle this part is up to you?
Thread.sleep(500); // Sleep for 500 ms
}
的terminating
變量是一個boolean
,是決定變量它控制何時終止循環。請注意0方法如何被用來「冷靜」執行,如果省略,Android會在應用程序中放置一個十字線並終止它,換句話說,要對系統資源有禮貌。
提示:擴展Thread
類,以保持的經accept()
方法處理傳入的連接的功能。
當incomingClientSocket
變爲非空,那麼另一個線程被創建在其中打開incomingClientSocket
的輸入/輸出流和讀/寫使用二進制時尚它。
不要使用readline
方法,因爲這表示設計不佳,並且假設數據是文本的,因爲到客戶端的一個傳入數據包可能是例如720bytes,之後進入的下一個數據包可能會以及564字節,這是TCP/IP的性質。
您需要想出一個更可靠的方法來建立數據傳輸的邊界,例如開始和結束標記,並讓服務器讀取傳入數據並區分組成開始和結束的字節流,結束標記,一旦兩者都存在,然後提取標記之間的實際數據並相應地對其執行操作。
例如,您可以在incomingClientSocket
實際上變爲非null,向您的活動發送一個廣播以對其執行操作,然後讓該活動接受該套接字並打開連接並讀/寫/來自與套接字關聯的輸入/輸出流。
你的解釋很棒,真的教會了我很多!它是否有所作爲,如果我是我的應用程序只是一個套接字而不是套接字服務器?我不接受連接 - 只是連接和發送和接收數據 –
同樣的事情適用不管:) – t0mm13b
謝謝!我正在努力:) –