Android 端“被挤下线”功能的实现

更新时间:2017-11-27 09:44:51 点击次数:1345次

单点登录(被挤下线)分析

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


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


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

api请求中后台返回特定的code。缺点是需要下次请求才知道被踢下线

使用推送。后台可以推送给APP,从而使APP得知已在其他地方登陆,可以及时响应。


使用第三方的监听器。比如集成了环信,环信自身有提供连接状态的接听,通过监听环信的用户状态,从而达到监听app自身用户系统的效果

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


具体实现

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

// 注册连接监听 EMChatManager.getInstance().addConnectionListener(connectionListener); 
  1. 实现这个连接监听,的那个检测到连接断开的时候判断是用户被移除还是连接冲突即账号在其他地方登陆,做出相应的操作。

// 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    }
}; 


  1. 我们只关心账号在别处登陆,这个时候,我们一般要跳转到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。


  1. 回到 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();
    }
} 


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

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

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!