从服务更改UI

时间:2014-05-21 18:02:41

标签: android service

我坚持服务的棘手,真的需要一些帮助。这里我有一个方法来监听聊天消息并将其发送到ListAdapter:

 @Override
 public void processPacket(Packet packet) {
     Handler mHandler = new Handler();
     Message message = (Message) packet;
     if (message.getBody() != null) {
         String fromName = StringUtils.parseBareAddress(message.getFrom());
         Log.i("XMPPChatDemoActivity ", " Text Recieved " + message.getBody() + " from " +  fromName);
         messages.add(fromName + ":");
         messages.add(message.getBody());

         // Add the incoming message to the list view
         mHandler.post(new Runnable() {
             public void run() {
                 setListAdapter();

这是我的Listadapter:

public static void setListAdapter() {
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, messages);
    listview.setAdapter(adapter);
}

我需要将聊天消息检索代码放在永久服务中,并将消息发送到主活动,因为服务无法与UI交互。我知道一个处理程序可以完成这项工作,但是正如我尝试的那样,我会更加困惑。

2 个答案:

答案 0 :(得分:3)

您可以使用Otto之类的活动总线从MainActivityService发送更新。

就像kcoppock所说,你应该将你的消息保存在数据库中并使用ContentObserver跟踪更改。

答案 1 :(得分:2)

如果您将消息存储在数据库中,您还可以添加ContentProvider并让Activity注册ContentObserver进行更改。然后,您的Service将只负责更新数据库,如果UI可见,它将检测更改。您可能最终只能使用LocalBroadcastManager(在v4支持库中)执行某些操作来通知何时收到新消息;但是你仍然应该把信息永久地留在某处。