| 关键词: nbsp 用户 推送 消息 errorCode onBind userId String Context 百度 |
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:【张鸿洋的博客】一直在仿微信界面,今天终于有幸利用百度云推送仿一仿微信聊天了~~~首先特别感谢:weidi1989分享的Android之基于百度云推送IM ,大家可以直接下载;省了很多事哈,本例中也使用了weidi的部分代码,凡是@author way的就是weidi1989的代码~~1、效果图核心功能也就上面的两张图了~~~我拿着手机和模拟器聊天,同时感谢群里的兄弟姐妹帮忙测试(好友列表中)。2、原理下面通过几个问题来说明下实现的原理:1、如何实现给某个用户发送消息呢?其实就是利用百度云提供的REST API,直接通过发送Http请求的形式给某个用户推送一条消息;网址:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api/list实例:push_msg功能推送消息,该接口可用于推送单个人、一群人、所有人以及固定设备的使用场景。HTTP请求方式POSTURLhttp[s]://channel.api.duapp.com/rest/2.0/channel/channel....2、的确可以实现给某个用户或者一群用户推送消息,那么用户的昵称神马的咋获取的呢,我印象中百度云中没法存这样的数据?嗯,其实用了一个比较巧妙的方式;在用户首次安装软件的时候,会要求用户填写注册信息,也就是昵称等;当用户填写完毕时,点击登录的时候:1、发送一条比较特殊的消息,比如这个消息携带一个hello的字段,广播给所有用户;2、其他用户在收到消息时,首先判断hello这个字段是否有值,有值则说明新用户加入,把该新用户存入本地数据库,然后更新用户列表;3、其他用户给这个新用户回一条消息,附带一个特殊字段,比如welcome,当新用户收到携带welcome字段的消息时,表明这是对新用户hello的答复,然后将已存在用户添加到该新用户的用户列表。基本原理就这样了,大家甚至可以利用上述的原理添加一些删除好友的功能;比如当用户点击删除好友,则发送一条特殊消息给被删除的对象,然后对方收到该消息,也将发送发删除。相信大家在了解原理之后,这个例子瞬间从高大尚变成矮矬穷了,这尼玛,so easy,谁不会啊~~~3、核心代码解析由于代码量还是相当大的,也不想拆成几篇博客,所以准备将核心代码进行讲解下,其他的大家自己看源码~关于这个例子的主界面,可以参考: 高仿微信5.2.1主界面架构 包含消息通知关于百度云推送的入门,可以参考:Android推送 百度云推送 入门篇好了,最主要就是收到百度云推送的Receiver1、onBind首先是用户第一次登录时候绑定的回调[java] view plaincopy@Override public void onBind(final Context context, int errorCode, String appid, String userId, String channelId, String requestId) { String responseString = "onBind errorCode=" + errorCode + " appid=" + appid + " userId=" + userId + " channelId=" + channelId + " requestId=" + requestId; Log.e(TAG, responseString); if (errorCode == 0) { SharePreferenceUtil util = PushApplication.getInstance() .getSpUtil(); util.setAppId(appid); util.setChannelId(channelId); util.setUserId(userId); } else // 如果网络正常,则重试 { if (NetUtil.isNetConnected(context)) { T.showLong(context, "启动失败,正在重试..."); new Handler().postDelayed(new Runnable() { @Override public void run() { PushManager.startWork(context, PushConstants.LOGIN_TYPE_API_KEY, PushApplication.API_KEY); } }, 2000);// 两秒后重新开始验证 } else { T.showLong(context, R.string.net_error_tip); } } // 回调函数 for (int i = 0; i < bindListeners.size(); i++) bindListeners.get(i).onBind(userId, errorCode); } 初次绑定的时候,如果绑定成功则使用SharedPreferences存储userId,channelId等数据然后回调:bindListeners.get(i).onBind(userId, errorCode);给所有注册该事件的发出通知下面看listener.onBind[java] view plaincopy/** * 收到通知 */ @Override public void onBind(String userId, int errorCode) { Log.e("TAG", "Login Activity onBind "); if (errorCode == 0) { Log.e("TAG", "Login Activity onBind success "); // 如果绑定账号成功,由于第一次运行,给同一tag的人推送一条新人消息 User u = new User(mSpUtil.getUserId(), mSpUtil.getChannelId(), mSpUtil.getNick(), mSpUtil.getHeadIcon(), 0); mUserDB.addUser(u);// 把自己添加到数据库 Message firstSendMsg = new Message(System.currentTimeMillis(), ""); 声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除 |