1.原理:
被挤下线
功能,即一个账号在A客户端保持登陆状态,然后又在B客户端进行了登陆操作,那么A客户端就会被挤下线。
当用户user1使用账号123456登录app后,用户user2在另一台手机使用同一账号123456登录,这时需要给A发通知给出提示,并强制user1下线。在app不在前台(包括完全退出和按了home键)的时候,不给提示,重新进入app给出提示.
那么其实有4种情况:
1.user1在app内,直接弹出dialog并强制下线;
非常好实现
2.user1按了home键
这时候是能收到消息的,但是不应该给出提示,需要在app onResume的时候弹出提示。我是这么做的,在Receiver的onReceive方法中进行状态保存(使用SP保存个值userLoginAnotherPlace),在BaseActiviy的onResume方法里进行判断,userLoginAnotherPlace的值变化了,那么弹出提示。
3.user1退出app,但是service仍然在后台运行,这时候是能收到推送消息的
同2.
4.user1完全杀死app,收不到推送消息,但是在很短的一段时间内重新打开app,消息仍然会收到。这时候因为极光会提供有限时长的离线消息
同1,但是有一个小问题(情况1一般不会出现,但是也是有可能的),一般app都有启动页,那其实不应该再启动页就弹出dialog,这样会造成非常差的用户体验,所以在弹出dialog的时候要对当前正在运行的Activity进行判断。
5.user1完全杀死app,收不到推送消息,但是过了很长的一段时间后重新打开app,消息不会收到。
这时候会出现这种现象,user1和user2同时登录成功。但是没给user1提示。所以在启动的时候强制用户user1自动登录来进行状态的判别,比如返回200是正常登录成功,自动登录返回203(注:自动登录和正常登录的服务器接口需要区分开,可以使用不同接口,也可以通过添加参数来标识)
2.说明:
Android SDK 导入
集成前准备
手动复制jar包及so导入
到环信官网下载环信 SDK。
考虑到开发者需求不一样,在下载的 SDK 中,提供了两个不同的 jar 包:
-
一个是 libs 下带实时语音功能和实时视频功能的 jar 包和 so 文件。
-
如果你不需要实时语音、实时视频功能,那就直接用 libs.without.audio 文件夹下的 jar 包及 so 文件。
SDK 目录讲解
从官网上下载下来的包,解压后内容如下:
在这里主要介绍后面四个文件夹内容:
-
doc 文件夹:SDK 相关 API 文档
-
examples 文件夹:ChatDemoUI3.0(Demo,依赖 EaseUI 库)、EaseUI
-
libs.av 文件夹:包含IM和实时音视频功能所需要的 jar 和 so 文件
-
libs.lite 文件夹:无实时语音、实时视频功能的 SDK 包,如果项目中只用到聊天功能,可以把项目里的 jar 和 so 文件替换成此文件夹里的文件
配置工程
导入 SDK
在自行开发的应用中,集成环信聊天需要把 libs 文件夹下的 jar 及 so 文件复制到你的项目的 libs 文件夹相应位置,如果不需要语音和视频通话功能,导入libs.lite 下的文件即可。
配置信息
在清单文件 AndroidManifest.xml 里加入以下权限,以及写上你注册的 AppKey。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"