2024年安卓最新Android 高仿微信实时聊天 基于百度云推送,轻松面试问题

最后说一下我的学习路线

其实很简单就下面这张图,含概了Android所有需要学的知识点,一共8大板块:

  1. 架构师筑基必备技能
  2. Android框架体系架构(高级UI+FrameWork源码)
  3. 360°Androidapp全方位性能调优
  4. 设计思想解读开源框架
  5. NDK模块开发
  6. 移动架构师专题项目实战环节
  7. 移动架构师不可不学习微信小程序
  8. 混合开发的flutter

Android学习的资料

我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。

330页PDF Android学习核心笔记(内含上面8大板块)

Android学习的系统对应视频

总结

我希望通过我自己的学习方法来帮助大家去提升技术:

  • 1、多看书、看源码和做项目,平时多种总结

  • 2、不能停留在一些基本api的使用上,应该往更深层次的方向去研究,比如activity、view的内部运行机制,比如Android内存优化,比如aidl,比如JNI等,并不仅仅停留在会用,而要通过阅读源码,理解其实现原理

  • 3、同时对架构是有一定要求的,架构是抽象的,但是设计模式是具体的,所以一定要加强下设计模式的学习

  • 4、android的方向也很多,高级UI,移动架构师,数据结构与算法和音视频FFMpeg解码,如果你对其中一项比较感兴趣,就大胆的进阶吧!

希望大家多多点赞,转发,评论加关注,你们的支持就是我继续下去的动力!加油!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

}

初次绑定的时候,如果绑定成功则使用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();

if (mUserMessages.containsKey(userId))

{

mUserMessages.put(userId, mUserMessages.get(userId) + 1);

} else

{

mUserMessages.put(userId, 1);

}

mUnReadedMsgs++;

notifyUnReadedMsg();

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

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

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

TimeUtil.getTime(message.getTimeSamp()));

mApplication.getMessageDB().add(userId, chatMessage);

// 通知listview数据改变

mAdapter.notifyDataSetChanged();

}

1、如果是自己发的不做任何处理

2、如果当前消息发送用户已有未读消息,则更新该用户未读消息个数(用户Item上显示未读消息通知数),更新所有未读消息总和(朋友Tab上显示未读消息总和),然后存储该消息

3、刷新界面

ChattingActivity.java聊天界面的新消息回调

@Override

public void onNewMessage(Message message)

{

// 获得回复的消息

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

复的消息

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter
    [外链图片转存中…(img-BpLkfU7e-1715803261904)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值