Java 使用Android服务处理网络连接

Java 使用Android服务处理网络连接,java,android,android-service,android-networking,Java,Android,Android Service,Android Networking,我正在开发一款Android应用程序,它需要与聊天服务器保持网络连接。我知道我可以创建一个服务来启动与服务器的连接,但是该服务如何通知Android活动新的传入消息?活动需要更新视图以显示新消息。我对安卓相当陌生,所以非常感谢您的帮助。谢谢 您是否查看了服务API页面:? 它有几个关于如何与服务交互的示例 服务与活动在同一线程和同一上下文上运行。请在此查看: 最后,再看看Lars Vogel的文章:你能把处理程序传递给你的服务吗 首先,将处理程序定义为接口。这是一个例子,所以你的可能更复杂 pu

我正在开发一款Android应用程序,它需要与聊天服务器保持网络连接。我知道我可以创建一个服务来启动与服务器的连接,但是该服务如何通知Android活动新的传入消息?活动需要更新视图以显示新消息。我对安卓相当陌生,所以非常感谢您的帮助。谢谢

您是否查看了服务API页面:?
它有几个关于如何与服务交互的示例

服务与活动在同一线程和同一上下文上运行。请在此查看:


最后,再看看Lars Vogel的文章:

你能把处理程序传递给你的服务吗

首先,将处理程序定义为接口。这是一个例子,所以你的可能更复杂

public interface ServerResponseHandler {

    public void success(Message[] msgs); // msgs may be null if no new messages
    public void error();

}
在活动中定义处理程序的实例。由于它是一个接口,您将在活动中提供实现,因此您可以从处理程序中引用封闭活动的字段和方法

public class YourActivity extends Activity {

// ... class implementation here ...

    updateUI() { 
        // TODO: UI update work here
    }

    ServerResponseHandler callback = new ServerResponseHandler() {

        @Override
        public void success(Message[] msgs) {
            // TODO: update UI with messages from msgs[]

            YourActivity.this.updateUI();
        }

        @Override
        public void error() { 
            // TODO: show error dialog here? (or handle error differently)
        }

    }

    void onCheckForMessages() { 
        networkService.checkForMessages(callback);
    }
NetworkService将包含以下内容:

void checkForMessages(ServerResponseHandler callback) { 

    // TODO: contact server, check for new messages here

    // call back to UI
    if (successful) { 
        callback.success(msgs);
    } else {
        callback.error();
    }
}  
此外,正如Aleadam所说,您还应该注意,默认情况下服务运行在同一线程上。对于网络之类的东西,这通常不是首选行为。明确警告不要在没有单独线程的情况下联网:

警告:服务在其宿主进程的主线程中运行,但服务没有 创建自己的线程,并且不在单独的进程中运行(除非您指定 否则)。这意味着,如果您的服务要执行CPU密集型工作或 阻止操作(如MP3播放或联网),应创建新线程 在服务范围内完成该工作。通过使用单独的线程,您将减少 应用程序不响应(ANR)错误的风险,应用程序的主线程可以继续专用于用户与您的活动的交互


有关在服务中使用线程的更多信息,请参阅SO文章和

一种常见且有用的方法是在活动中注册广播接收器,并让服务在有有用数据时发送通知事件。我发现这比通过回调实现处理程序更容易管理,主要是因为当配置发生更改时,它更容易、更安全。如果您将一个直接的活动引用传递给服务,那么当活动被破坏时(在旋转期间或后台),您必须非常小心地将其清除,否则会导致泄漏

使用广播接收器,当活动被销毁时,您仍然必须取消注册,但是该服务从未直接引用该活动,因此如果您忘记了该活动,则不会泄漏。创建主题时,让活动注册器收听主题也更容易,因为它不必获得对服务的直接引用

Lars Vogel的文章讨论了这种方法,它绝对值得一读