关于百度云推送的入门,可以参考: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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-UU306u94-1713205432340)]
最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!