您的位置:首页 > 移动开发 > Android开发

android关于限制同一账号在不同设备同时登陆的实现

2016-10-19 15:02 393 查看
先说下需求:
当用户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(注:自动登录和正常登录的服务器接口需要区分开,可以使用不同接口,也可以通过添加参数来标识)

后续注意:本来设置别名是设置的uid,但是出现了这么一种情况,服务器返回时间和极光推送消息到达的时间是不能确定先后顺序的,而且极光推送是有延迟的,那么就会出现,当A登录后,B登录,B登录成功设置别名,但是这时候极光推送还没进行推送消息(即登录成功优先于推送消息到达,A,B两个用户都会收到退出登录的推送),所以为了解决这种情况,需要单独处理。

我的做法是根据androidId推送,登录时多加一个参数androidid,当退出时通知服务器清除androidid(为什么要加这一步呢,因为要保证androidid和用户关联,还是举例说明,当账号A (androidid为aa)登录成功后,退出登录(客户端会将别名设置为空,但这是不够的,因为如果不通知服务器的话,服务器的数据库里还保存着A登录时的androidid aa),然后登录账号B(androidid为aa),另一台手机登录账号A,那么服务器会通知androidid为aa的设备(其实不应该通知的,因为A已经在设备aa上已经下线了啊!)这部分逻辑还没做,后续会补上的
关于保存唯一标识(因为androidid并不一定是可靠的,所以可以使用uuid.参考http://blog.csdn.net/dai_zhenliang/article/details/8634042
下面是在Receiver中弹出dialog的实现问题。
http://blog.csdn.net/chenfuduo_loveit/article/details/42123303
http://www.eoeandroid.com/thread-211915-1-1.html
http://suanfazu.com/t/show-an-alert-dialog-in-broadcast-receiver-after-a-system-reboot/10431
http://www.voidcn.com/blog/wx19930125/article/p-6154834.html
https://www.zhihu.com/question/37849134
具体我的实现方法是写一个透明的Activity,然后在Activity里弹出一个Dialog.

关于php的东西也不是太懂,就随便写了些,参考:http://www.cnblogs.com/CaenLove/p/4236332.html

代码https://github.com/xturbofan/SingleLoginDemo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: