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

先说下需求:
当用户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的实现问题。
具体我的实现方法是写一个透明的Activity,然后在Activity里弹出一个Dialog.

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



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值