前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android端“被挤下线”功能的单点登录实现

Android端“被挤下线”功能的单点登录实现

作者头像
砸漏
发布2020-10-26 18:07:02
1.5K0
发布2020-10-26 18:07:02
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

单点登录(被挤下线)

所谓的被挤下线功能,即一个账号在A客户端保持登陆状态,然后又在B客户端进行了登陆操作,那么A客户端就会被挤下线。

服务端需要返回Token,每次在app登录时为app分配一个新的token,如果在某次请求中app传递token不是最新的,则视为需要重新登录,在token失效的情况下,返回约定好的code

App如何知道该账户已经在其他设备上登陆了呢?有三种实现方式

  1. api请求中后台返回特定的code。缺点是需要下次请求才知道被踢下线
  2. 使用推送。后台可以推送给APP,从而使APP得知已在其他地方登陆,可以及时响应。
  3. 使用第三方的监听器。比如集成了环信,环信自身有提供连接状态的接听,通过监听环信的用户状态,从而达到监听app自身用户系统的效果

我们的项目中集成了环信的即时聊天,所以就使用了环信的监听器监听用户状态,用来判断是否已在其他地方登陆,实现挤下线功能。

1、首先在初始化环信的时候设置一个全局的监听器里面注册一个连接监听。

代码语言:javascript
复制
// 注册连接监听
EMChatManager.getInstance().addConnectionListener(connectionListener);

2、实现这个连接监听,的那个检测到连接断开的时候判断是用户被移除还是连接冲突即账号在其他地方登陆,做出相应的操作。

代码语言:javascript
复制
// 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
  }
};

3、我们只关心账号在别处登陆,这个时候,我们一般要跳转到MainActivity,然后强制弹出对话框提示用户重新登陆。

代码语言:javascript
复制
/**
* 账号在别的设备登录
*/
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。

4、回到MainActivity中的onNewIntent方法

代码语言:javascript
复制
@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();
  }
}

首先会判断标识,如果是账户冲突就会弹出对话框提示用户跳转登陆页面重新登陆。另外这个对话框是不能取消也不可关闭的。

这样被挤下线功能就基本实现了。

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档