安卓上的XMPP事件

4

我正在尝试开发一个后台进程,拦截XMPP消息并执行操作,我使用asmack作为主要的XMPP库。我猜我需要一个广播接收器来响应特定的意图。问题是如何引发意图?这一定是可能的,因为谷歌聊天客户端中存在此功能。 非常感谢。

2个回答

2
如果您真的想实现这种行为,您可以考虑运行asmack XMPP客户端的持久化后台服务。您XMPP客户端的监听器方法(即processPacket)可能会引发一个意图。然后,您可以通过使用BroadcastReceiver从另一个应用程序或此应用程序内部捕获此意图。
final Context context = getContext(); // or getApplicationContext(). context must be final.
PacketFilter packetFilter = new MessageTypeFilter(Message.Type.chat);
connection.addPacketListener(new PacketListener() {
    @Override
    public void processPacket(Packet packet) {
        Message message = (Message) packet;
        if (message.getBody() != null) {
            String from = StringUtils.parseBareAddress(message.getFrom());
            Intent intent = new Intent();
            intent.setAction("your.package.XMPP_PACKET_RECEIVED");
            intent.putExtra("from", from);
            intent.putExtra("body", message.getBody());
            context.sendBroadcast(i);
        }
    }
}, packetFilter);

您还可以尝试通过创建一个BroadcastReceiver(或IntentService)来实现另一个通信方向,以接收意图并通过XMPP发送它。 BackgroundReceiver将不得不为每个消息创建一个新的连接,这将很慢但节省能源(没有必要保持XMPP会话活动)。


1
我猜我需要一个广播接收器来响应特定的意图。
可能不需要。aSmack似乎主要是Smack,与Android无关,因此没有意图的概念。
这一功能在Google Talk客户端中存在,所以肯定是可行的。
据我所知,“Google Talk客户端”并未使用Smack。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接