简而言之,Android 可以并且将会杀死任何占用资源以继续运行的应用程序。如何处理可能威胁您的应用程序被杀死的场景是您的责任。
我建议查看开发者网站上的服务生命周期。
首先,任何占用太多的应用程序,无论是服务/活动,以这种方式被认为是......在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
变量是 aboolean
并且是控制何时终止循环的决定性变量。注意该Thread.sleep
方法是如何使用的,以“冷静”执行,如果省略,Android 将在应用程序上放置一个十字准线并终止它,换句话说,对系统资源有礼貌。
提示:扩展Thread
类,以保持通过该accept()
方法处理传入连接的功能。
当incomingClientSocket
变为非空时,将创建另一个线程,在该线程中它打开 的输入/输出流并使用二进制incomingClientSocket
方式对其进行读/写。
不要使用该readline
方法,因为这表明设计不佳并假设数据是文本的,因为到客户端的一个传入数据包可能是例如 720 字节,之后传入的下一个数据包很可能是 564 字节,这就是 TCP/IP 的本质。
你需要想出一种更可靠的方式来建立数据传输的边界,例如开始和结束标记,并让服务器读取传入的数据并区分由开始和结束标记组成的字节流,一次两者都存在,然后提取标记之间的真实数据并据此采取行动。
例如,您可以说,当incomingClientSocket
它实际上变为非空时,向您的活动发送广播以对其进行操作,并让活动,获取该套接字,并打开连接并从输入/输出读/写与套接字关联的流。