Android 高仿微信实时聊天 基于百度云推送,书籍+视频+学习笔记+技能提升资源库

本文详细介绍了如何在Android应用中集成和使用百度云推送服务,涉及`onBind`和`onMessage`回调的处理,以及新用户注册和消息推送的逻辑。
摘要由CSDN通过智能技术生成

关于百度云推送的入门,可以参考:Android推送 百度云推送 入门篇

好了,最主要就是收到百度云推送的Receiver

1、onBind


首先是用户第一次登录时候绑定的回调

@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

/**

  • 收到通知

*/

@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(), “”);

firstSendMsg.setHello(“hello”);

task = new SendMsgAsyncTask(mGson.toJson(firstSendMsg), “”);

task.setOnSendScuessListener(new OnSendScuessListener()

{

@Override

public void sendScuess()

{

if (mLoadingDialog != null && mLoadingDialog.isVisible())

mLoadingDialog.dismiss();

mHandler.removeCallbacks(mConnTimeoutCallback);

finish();

Intent intent = new Intent(LoginActivity.this,

MainActivity.class);

startActivity(intent);

}

});

task.send();

}

}

首先将自己保存到本地数据库,然后发送一个Message给所有的用户,设置一个特殊字段hello;也就是上述的原理分析中的部分~

2、onMessage


收到百度云推送的Receiver中的onMessage

@Override

public void onMessage(Context context, String message,

String customContentString)

{

String messageString = “收到消息 message=”" + message

  • “” customContentString=" + customContentString;

Log.e(TAG, messageString);

Message receivedMsg = PushApplication.getInstance().getGson()

.fromJson(message, Message.class);

// 对接收到的消息进行处理

parseMessage(receivedMsg);

}

/**

  • 消息:1、携带hello,表示新人加入,应该自动回复一个world 消息; 2、普通消息;

  • @param msg

*/

private void parseMessage(Message msg)

{

String userId = msg.getUserId();

// 自己的消息

if (userId

.equals(PushApplication.getInstance().getSpUtil().getUserId()))

return;

if (checkHasNewFriend(msg) || checkAutoResponse(msg))

return;

// 普通消息

UserDB userDB = PushApplication.getInstance().getUserDB();

User user = userDB.selectInfo(userId);

// 漏网之鱼

if (user == null)

{

user = new User(userId, msg.getChannelId(), msg.getNickname(), 0, 0);

userDB.addUser(user);

// 通知监听的面板

for (onNewFriendListener listener : friendListeners)

listener.onNewFriend(user);

}

if (msgListeners.size() > 0)

{// 有监听的时候,传递下去

for (int i = 0; i < msgListeners.size(); i++)

msgListeners.get(i).onNewMessage(msg);

} else

// 当前没有任何监听,即处理后台状态

{

// 将新来的消息进行存储

ChatMessage chatMessage = new ChatMessage(msg.getMessage(), true,

userId, msg.getHeadIcon(), msg.getNickname(), false,

TimeUtil.getTime(msg.getTimeSamp()));

PushApplication.getInstance().getMessageDB()

.add(userId, chatMessage);

showNotify(msg);

}

}

/**

  • 检测是否是自动回复

  • @param msg

*/

private boolean checkAutoResponse(Message msg)

{

String world = msg.getWorld();

String userId = msg.getUserId();

if (!TextUtils.isEmpty(world))

{

User u = new User(userId, msg.getChannelId(), msg.getNickname(),

msg.getHeadIcon(), 0);

PushApplication.getInstance().getUserDB().addUser(u);// 存入或更新好友

// 通知监听的面板

for (onNewFriendListener listener : friendListeners)

listener.onNewFriend(u);

return true;

}

return false;

}

/**

  • 检测是否是新人加入

  • @param msg

*/

private boolean checkHasNewFriend(Message msg)

{

String userId = msg.getUserId();

String hello = msg.getHello();

// 新人发送的消息

if (!TextUtils.isEmpty(hello))

{

Log.e(“checkHasNewFriend”, msg.getUserId());

// 新人

User u = new User(userId, msg.getChannelId(), msg.getNickname(),

msg.getHeadIcon(), 0);

PushApplication.getInstance().getUserDB().addUser(u);// 存入或更新好友

T.showShort(PushApplication.getInstance(), u.getNick() + “加入”);

// 给新人回复一个应答

Message message = new Message(System.currentTimeMillis(), “”);

message.setWorld(“world”);

new SendMsgAsyncTask(PushApplication.getInstance().getGson()

.toJson(message), userId);

// 通知监听的面板

for (onNewFriendListener listener : friendListeners)

listener.onNewFriend(u);

return true;

}

return false;

}

当收到一个新的消息:

1、首先判断是不是自己发的,是,忽略;

2、判断是否携带hello字段,代表新人加入,携带,则保存到好友列表,且回复一个携带welcome字段的消息;

3、判断是否包含welcome字段,包含,存入好友列表

4、不是1、2、3则肯定是普通消息,将消息保存到本地数据库,然后为所有设置消息监听的发送回调即可~

MainTabFriends.java用户列表中收到新消息的回调:

/**

  • 收到新消息时

*/

@Override

public void onNewMessage(Message message)

{

// 如果是自己发送的,则直接返回

if (message.getUserId() == mSpUtils.getUserId())

return;

// 如果该用户已经有未读消息,更新未读消息的个数,并通知更新未读消息接口,最后notifyDataSetChanged

String userId = message.getUserId();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

这次面试问的还是还是有难度的,要求当场写代码并且运行,也是很考察面试者写代码
因为Android知识体系比较庞大和复杂的,涉及到计算机知识领域的方方面面。在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

总结

这次面试问的还是还是有难度的,要求当场写代码并且运行,也是很考察面试者写代码
因为Android知识体系比较庞大和复杂的,涉及到计算机知识领域的方方面面。在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-yjLuW9n5-1712366767156)]
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值