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

单点登录(被挤下线)

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

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

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

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

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

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

// 注册连接监听 EMChatManager.getInstance().addConnectionListener(connectionListener);

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

// 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,然后强制弹出对话框提示用户重新登陆。

/** * 账号在别的设备登录 */ 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方法

@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(); } }

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

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

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

时间: 2024-09-25 13:42:39

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

微软使用 Android 端 Cortana 通知同步功能鼓励开发者创建 UWP 应用

近年来,微软一直推进Cortana在Android和iOS竞争对手平台的发展,不断修复BUG和增加功能.在最新上线的Windows 10系统中新增了通知同步功能,能够在Windows 10 Action Centre中接收和交互Android手机端的通知,这不仅是一项非常实用的功能,而且微软尝试借助这项功能向开发者推广Windows Store. 在Windows 10的最新版本中,Action Centre中来自Android设备的通知标记将需要包含一个"Request App"的按

绑定小米推送后被挤下线,调用退出登录出错,错误码,211,faild to unbind device token

问题描述 我绑定了小米推送,而且绑定成功,能够接收到推送,调用退出登录一直能解绑成功,但当我被挤下线时,会调用退出登录的代码,可是,有些机型调用退出登录就解绑失败导致退出登录失败 解决方案 被踢下线调用退出的方法,第一个参数传false

Android端实现单点登录的方法详解_Android

前言 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉.实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效

Android强制下线功能实现的代码示例

强制下线的应用场景很多, 比如我们好多账号都有抢登的显现, 会被挤下线. 详细实现: 其实实现强制下线功能的思路也比较简单, 只需要在界面弹出一个对话框, 让用户无法进行其他操作, 必须点击对话框中的确定按钮, 然后回到登录界面即可. 但是又有一个问题, 我们通知用户强制下线, 用户可能正处于任何一个界面, 难道需要在每个界面上都编写一个弹出对话框的逻辑? 当然不是! 我们可以借助本章中所学的广播知识来轻松实现这一功能. public class ActivityConllector { pub

Android端实现单点登录的方法详解

前言 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉.实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效

android端实现验证码随机生成功能

本文实例为大家分享了android端生成随机验证码的具体代码,供大家参考,具体内容如下 package com.nobeg.util; import java.util.Random; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Bitmap.

【软件周刊第 32 期】Ubuntu 最新构建版启用 GNOME;Android 端 Chrome 59 提升页面加载速度

在最新发布的 Ubuntu 17.10 每日构建版中,Unity 桌面环境已消失,GNOME 已经正式成为即将推出的Ubuntu 17.10(Artful Aardvark)版本的默认桌面环境. 据悉,Ubuntu 17.10 将在 9 月 28 日发布 Final Beta 版本,这时候才会基本确定下来所有的内容,10 月 19 日 Ubuntu 17.10(Artful Aardvark)将正式发布. Android O 开发者预览版 Beta3 发布:包含最终 API 谷歌为参与 Andr

如何实现基于应用层组播模式的Android端视频直播?

问题描述 如何实现基于应用层组播模式的Android端视频直播? 各位大神好,小弟想做一个Android视频直播的应用,具体要实现的功能是:一个Android手机通过摄像头实时采集视频数据并将其转发到其他手机(视频流不通过PC端的服务器),接收到数据的手机直接播放视频数据同时转发该数据到其下层节点. PC端的服务器主要实现各个手机之间的协调注册工作.我现在想的是用ffmpeg做视频采集和编解码,用rtp实现视频流的推送. 不知道各位有没有什么更好的建议? PS:一个人写代码感觉效率很低,有没有对

android 同步-android端如何实现数据同步问题?求思路、方法

问题描述 android端如何实现数据同步问题?求思路.方法 目前在做pad应用,应用所有数据都用sqlit保存在本地了,然后有3种同步功能,分别是: 1.立即同步 2.自动同步 3.仅在wifi下同步 现在没有好的. ** 完整 ** 的思路,请教各位.目前,在下有以下疑惑 a.是否需要服务.通知之类的还是仅仅一个定时器就可以了还是定时器写在服务中 b.如何在同步过程中有较好的用户体验,如在同步时,用户可以操作,同步完提示用户刷新页面等 有没有相关案例呢? 解决方案 如果你不是非要使用自己的同