使用XMPP数据包侦听器实现Android后台服务

时间:2011-12-10 16:39:36

标签: android android-widget xmpp android-service asmack

我正在使用Smack XMPP客户端为Android开发IM Messenger。 我想这样做 当用户登录时,我想在后台服务中附加PackerListener和XMPPConnection引用对象。 xmppCon.addPacketListener(......)。此数据包侦听器用于侦听传入请求(可以是聊天消息,订阅请求,群聊请求等)。现在获取此数据包请求后,我确定请求类型,如聊天消息,订阅请求等等。如果是聊天消息和我的聊天屏幕打开我想发送/更新该屏幕如果它是订阅请求我想更新我的待处理UI活动屏幕,这取决于我想要从服务更新特定UI的请求。 问题是如何从服务更新活动(活动活动)? 任何人都可以指导我如何做到这一点,或者可以给我更好的建议吗? 我会非常感激......

2 个答案:

答案 0 :(得分:0)

您可以创建一个服务类,然后在其Start方法中添加以下代码: -

RosterListener r1 = new RosterListener() {

                @Override
                public void presenceChanged(Presence presence) {
                    // TODO Auto-generated method stub

                    //sending the broadcast to update the expandable list view
                    //to check if any person's presence has changed.
                       sendBroadcast(new Intent(UserMenuActivity.ACTION_UPDATE));
notification("changed");

                }

                @Override
                public void entriesUpdated(Collection<String> arg0) {
                    // TODO Auto-generated method stub
                    //notification("entriesUpdated");
                }

                @Override
                public void entriesDeleted(Collection<String> arg0) {
                    // TODO Auto-generated method stub
                    //notification("entriesDeleted");
                }


                @Override
                public void entriesAdded(Collection<String> arg0) {
                    // TODO Auto-generated method stub
                    Iterator<String> it = arg0.iterator();
                    if (it.hasNext()) {
                        user = it.next();
                    }
                    /*RosterEntry entry = roster.getEntry(user);
                    if(entry.getType().toString().equalsIgnoreCase("to")){
                        int index_of_Alpha = user.indexOf("@");
                        String subID = user.substring(0, index_of_Alpha);

                        notification("Hi,"+subID+" wants to add you");
                    }       */      
                }
            };

            if (roster != null) {
                roster.setSubscriptionMode(Roster.SubscriptionMode.manual);
                System.out.println("subscription going on");
                roster.addRosterListener(r1);
            }

        } else {
            showToast("Connection lost-", 0);
        }

这就是你可以按照自己的要求做同样的事情。如有任何疑问,请随时向我询问。

答案 1 :(得分:-1)

如果状态发生变化,驱动XMPP连接的服务可以广播Intent。然后,您的UI活动(甚至是Widget)可以注册这些Intent并相应地更新它们的显示。