后台服务器方法

时间:2012-09-22 22:42:00

标签: android

我已经构建了一个Android聊天应用程序。它有一个TCP服务器,使用Socket连接到via。

我希望服务器连接始终在后台运行 - 即使应用程序不在前台 - 并监听从服务器发送的数据。

现在我使用while循环检查是否有新内容,但当Android需要资源时,操作系统会关闭我的线程。

我考虑过在我的帖子中使用readline()方法,而不是使用while循环,因为readline()是一种阻止方法。

这是正确的方法吗,这将导致防止操作系统杀死我的应用程序?

有没有办法,比如只有在传入套接字可用时才会启动的自定义广播接收器?

谢谢!

1 个答案:

答案 0 :(得分:1)

简而言之,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,是控制何时终止循环的决定变量。注意如何使用Thread.sleep方法来“冷静”执行,如果省略,Android将在应用程序上放置一个十字线并终止它,换句话说,对系统资源是礼貌的。

提示: 扩展Thread类,以保留通过accept()方法处理传入连接的功能。

incomingClientSocket变为非空时,会创建另一个线程,在该线程中打开incomingClientSocket的输入/输出流并使用二进制文件时尚。

不要使用readline方法,因为这表明设计不佳并且假设数据是文本的,因为一个到客户端的传入数据包可能是例如720字节,下一个数据包进入之后那可能是564字节,这就是TCP / IP的本质。

您需要提出一种更可靠的方法来建立数据传输的边界,例如,开始和结束标记,让服务器读取传入的数据并区分由开始和结束组成的字节流标记,一旦存在,然后提取标记之间的真实数据并相应地对其进行操作。

例如,您可以在incomingClientSocket上实际变为非空,向您的活动发送广播以对其进行操作,并让活动,接受该套接字,并打开连接并读取/写入/从与套接字关联的输入/输出流。