开发手记——基于XMPP的Android即时通讯APP(二)
隔了几天,把应用的登录、注册部分做的比较完善了,当然这只是个人感觉哈。
今天要说的,都是干货!
首先,没有大片代码;其次,在网上一般找不到;最后,真的让你节约开发时间!这也是为什么时隔好几天才会发第二篇连载。
既然说,没有大片代码,一般的登录、注册流程这里就不提了,百度谷歌一搜一大堆,而且基本都能用。这里说几点注意
【一】关于后台服务:
官方的建议,要使用“START_STICKY”这种类型的后台服务。为什么要用这种服务,官方的说法很明朗:
这点和Android Developer官网解释保持一致,需要注意的是,为了照顾4.4.2版本的Bug,需要在程序中做些处理。
上面的截图引用自:https://github.com/Flowdalic/asmack/wiki/Should-applications-using-aSmack-use-foreground-Services%3F
【二】关于断线重连:
新版本的aSamck4.0.6包中可以断线重连了,这一点和之前的版本还是有一点区别的。
【三】关于用户登陆的判断:
可以通过XMPPConnection对象获取连接状态,具体说明如下:
xmppConnection.isConnected() :布尔值表示是否连接到服务器(注意:此时用户不一定登录);
xmppConnection.isAuthenticated() : 布尔值表示是否登录成功(即用户名+密码验证通过),此时代表已登录成功,且与服务器保持连接。
【四】关于与服务器的交互操作:
用线程,Handler,切记!即使是在Service中。
【五】调试小技巧:
为了看清和服务器交互的内容(xml),可以在和服务器连接之前对ConnectionConfiguration做如下设置:
SmackConfiguration.DEBUG_ENABLED = true; connectionConfiguration = new ConnectionConfiguration(PrefUtil.getServerIP(context), PrefUtil.getServerPort(context)); connectionConfiguration.setReconnectionAllowed(true); connectionConfiguration.setSendPresence(true); connectionConfiguration.setRosterLoadedAtLogin(true); connectionConfiguration.setSecurityMode(SecurityMode.disabled); connectionConfiguration.setDebuggerEnabled(BuildConfig.DEBUG); xmppConnection = new XMPPTCPConnection(connectionConfiguration); xmppConnection.connect();其中connectionConfiguration是ConnectionConfiguration对象,PrefUtil是首选项工具类。
【六】注册时摸不到头脑?
4.0.6版本的aSmack包貌似用于注册的Registration类无法setUsername和setPassword,怎么办?下方贴出这部分代码:
Registration registration = new Registration(); registration.setType(IQ.Type.SET); registration.setTo(xmppConnection.getServiceName()); Map<String, String> attributes = new HashMap<String, String>(); attributes.put("username", username); attributes.put("password", password); registration.setAttributes(attributes); PacketFilter filter = new AndFilter(new PacketIDFilter(registration.getPacketID()), new PacketTypeFilter(IQ.class)); PacketCollector collector = xmppConnection.createPacketCollector(filter); xmppConnection.sendPacket(registration); IQ result = (IQ) collector.nextResult(xmppConnection.getPacketReplyTimeout()); collector.cancel(); if (result == null || result.getType() == IQ.Type.ERROR) { DebugUtil.Log("An error occured during registion, maybe the same username"); return false; } else { DebugUtil.Log("Registion has OK!"); return true; }如上所示,用HashMap来存放用户名和密码,然后作为Attributes,set到registration对象中就注册成功了。
【七】需要切换用户?
当应用需求切换当前登陆账户时,务必要先调用XMPPConnection中的disconnect()方法断开和服务器的连接(貌似没有单独的注销账户方法),然后重新connect(),再login()。
最后说一下项目进展:
目前完成了登录、注册和个人信息修改的功能。登录可以多账户,保存各账户的密码(如果用户要求),自动登录;由于应用提供了服务器的手动配置,因此在用户注册前可以切换到其他的服务器;上述服务器配置在登录界面可做修改,并存入首选项,应用启动时会检查是否已经配置;个人信息修改今天刚刚做好,手动小测了一下,还可以,但是鉴于没有做过严格的测试,所以先不提。
项目开源路径:https://[email protected]/wh1990xiao2005/anychat.git
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。