Android 端“被挤下线”功能的实现 2017-11-15 sun_____xin code小生 作者 | sun_____xin 地址 | http://www.jianshu.com/p/
2017-11-28 22:30
363 查看
Android 端“被挤下线”功能的实现
2017-11-15 sun_____xin code小生作者 | sun_____xin
地址 | http://www.jianshu.com/p/f61b69cad212
声明 | 本文是 sun_____xin 原创,已获授权发布,未经原作者允许请勿转载
单点登录(被挤下线)分析
所谓的被挤下线功能,即一个账号在A客户端保持登陆状态,然后又在B客户端进行了登陆操作,那么A客户端就会被挤下线。
服务端需要返回 Token,每次在app登录时为 app 分配一个新的 token,如果在某次请求中 app 传递 token 不是最新的,则视为需要重新登录,在token失效的情况下,返回约定好的code
App如何知道该账户已经在其他设备上登陆了呢?有三种实现方式
api请求中后台返回特定的code。缺点是需要下次请求才知道被踢下线
使用推送。后台可以推送给APP,从而使APP得知已在其他地方登陆,可以及时响应。
使用第三方的监听器。比如集成了环信,环信自身有提供连接状态的接听,通过监听环信的用户状态,从而达到监听app自身用户系统的效果
我们的项目中集成了环信的即时聊天,所以就使用了环信的监听器监听用户状态,用来判断是否已在其他地方登陆,实现挤下线功能。
具体实现
首先在初始化环信的时候设置一个全局的监听器里面注册一个连接监听。
// 注册连接监听 EMChatManager.getInstance().addConnectionListener(connectionListener);
实现这个连接监听,的那个检测到连接断开的时候判断是用户被移除还是连接冲突即账号在其他地方登陆,做出相应的操作。
// create the global connection listener connectionListener = new EMConnectionListener() { @Override public void onDisconnected(int error) { if (error == EMError.USER_REMOVED) { onCurrentAccountRemoved(); } else if (error == EMError.CONNECTION_CONFLICT) { onConnectionConflict(); } } @Override public void onConnected() { // in case group and contact were already synced, we supposed to // notify sdk we are ready to receive the events } };
我们只关心账号在别处登陆,这个时候,我们一般要跳转到MainActivity,然后强制弹出对话框提示用户重新登陆。
/** * 账号在别的设备登录 */ protected void onConnectionConflict() { Intent intent = new Intent(appContext, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Constant.ACCOUNT_CONFLICT, true); appContext.startActivity(intent); }
这个地方检测到登陆冲突之后需要回到 MainActivity,并为MainActivity 携带了一个标识和一个标记位Intent.FLAG_ACTIVITY_NEW_TASK,表示在一个新的 task 中开启一个 Activity,如果包含这个 Activity 的 task 已经在运行,那么这个Activity 就回到前台显示。然后回调 onNewIntent() 方法处理这个Intent。
回到 MainActivity 中的 onNewIntent 方法
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent.getBooleanExtra(Constant.ACCOUNT_CONFLICT, false) && !isConflictDialogShow) { showConflictDialog(); } else if (intent.getBooleanExtra(Constant.ACCOUNT_REMOVED, false) && !isAccountRemovedDialogShow) { showAccountRemovedDialog(); } }
首先会判断标识,如果是账户冲突就会弹出对话框提示用户跳转登陆页面重新登陆。另外这个对话框是不能取消也不可关闭的。
这样被挤下线功能就基本实现了。
相关文章推荐
- Android实现下拉导航选择菜单效果【转载地址:http://www.cnblogs.com/hanyonglu/archive/2012/07/31/2617488.html】
- Android实现推送方式解决方案【转载地址:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378971.html】
- 使用JS实现倒计时功能(http://www.cnblogs.com/doll-net)
- Android实现XML解析技术 (转载http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html)
- Android源码Demo地址:http://www.apkbus.com
- 声明函数指针并实现回调 \\作者:Danny Kalev,转自http://www.vckbase.com/document/viewdoc/?id=195 有改动,等有时间了再整理一下
- // 2、写一个网址过滤的功能,要求得到此网址的域名,比如下面地址: //http://www.google.com/search?hl=en&source=hp&q=objective+c /
- 使用JS实现倒计时功能(http://www.cnblogs.com/doll-net)
- 关于<验证码>的实现和执行流程 http://www.cnblogs.com/android-html5/archive/2012/05/19/2533650.html
- C#使用命令行方式实现Ping简单功能 http://www.cnblogs.com/kevinton/archive/2007/06/28/798581.html
- iOS之简单瀑布流的实现 http://www.jianshu.com/p/b92e1b1073fd
- iOS NSNotificationCenter 使用姿势详解 转载地址http://www.jianshu.com/p/a4d519e4e0d5
- 8,关于串行化的介绍及简单实现(原帖地址:http://www.vckbase.com/document/viewdoc/?id=918)
- 我的简书地址 - http://www.jianshu.com/users/0b178bfe372a/latest_articles
- Android 轻松实现语音识别(转http://www.cnblogs.com/TerryBlog/archive/2010/11/12/1875875.html)
- 请使用socket相关函数(非curl)实现如下功能:构造一个post请求,发送到指定httpserver的指定端口的指定请求路径(如http://www.example.com:8080/test)
- Android P2P语音通话实现(思路探讨)【转】http://www.cnblogs.com/milospooner/archive/2012/07/13/2590950.html
- java resteasy restful webservice教程(六):实现文件下载功能实例文章来源:爱上123 原文地址:http://www.ishang123.com/jishubowen/
- Blog地址更新:http://www.javabar.com.cn
- asp代码实现在线实时开通WEB及FTP http://www.nrcce.com/nrcce_bbs/viewthread.php?tid=650&highlight=