Android单点登录,互踢下线代码实现

分享一个在项目中必然会用到的小功能——单点登录,也就是我们常说的互踢下线。

国际惯例,先上效果图

一、先说逻辑,其实挺简单

​ 首先,对于监听账号是否在其他设备登录的方法,我们一般都会使用第三方即时通讯自带的监听功能,优点就是代码简单,可以实时监听。没有集成第三方即时通讯的,就得用代码自己实现了,当然这不是我们今天的重点,不再讨论。

​ 当我们的账号在其他设备登录时,无论我们当前在哪个界面都需要弹出提示框,提醒用户,所以弹出对话框的逻辑我们需要写在Activity的基类中。

​ 当用户选择取消的时候,需要退出当前应用,或者退出登录状态;当用户选择重新登录的话,则跳到登录界面,重新登录。

二、BaseActivity

在基类中,我们需要创建需要子类实现的抽象方法

public abstract class BaseActivity extends AppCompatActivity {private static LinkedList<AppCompatActivity> activities;//用户存储每一个打开的Activityprivate RelativeLayout container;//用户存放样式private Unbinder mButterBind;       @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (activities == null) {activities = new LinkedList<>();}activities.add(this);   //将当前activity放入到列表中container = new RelativeLayout(this);container.addView(LayoutInflater.from(this).inflate(initLayout(), null, false), new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));setContentView(container, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));mButterBind = ButterKnife.bind(this);initView();initData();bindListener();}protected abstract int initLayout();//子类在此方法中设置其布局样式protected abstract void initView(); //初始化子类viewprotected abstract void initData(); //初始化子类数据protected abstract void bindListener();//存放子类的点击事件@Overrideprotected void onDestroy() {super.onDestroy();//当activity中退出时,将其从列表中移除if (activities != null) {activities.remove(this);}mButterBind.unbind();}
}

在基类中,我们可以抽取一个常用的方法

/*** 彻底退出app*/protected void exitApp() {//需要退出app时,调用此方法for (AppCompatActivity baseActivity : activities) {baseActivity.finish();}activities.clear();//养成良好的习惯,不用的数据,需要及时清空,减少应用内存activities = null;}/*** 跳转到指定的页面** @param clazz*/public void startActivity(Class clazz) {Intent intent = new Intent(this, clazz);startActivity(intent);}

这样,我们一个简单的activity的基类就基本上写好了。

三、接下来就是需要我们实现的功能代码了

首先,当我们监听到账号在其他设备登录时,我们需要通知当前的应用,弹出提示对话框,一般来说,我们都是发广播。

 @OnClick(R.id.show)public void onClick() {//我们假装我们点击按钮的时候就是我们监听到账号在其他设备登录的时候,收到监听立即发送广播Intent intent = new Intent();intent.setAction("LoginOut");sendBroadcast(intent);}

而在BaseActivity中,我们需要注册广播接收者,接受其他设备登录的消息

        //注册广播receiver = new OtherEquipmentLoginReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("LoginOut");registerReceiver(receiver, intentFilter);

当然,也别忘了注销广播接收者

@Overrideprotected void onDestroy() {super.onDestroy();if (activities != null) {activities.remove(this);}//解除广播unregisterReceiver(receiver);mButterBind.unbind();}

当我们接收到广播的时候,立即对用户弹出提示对话框

/*** 在其他设备登录*/public class OtherEquipmentLoginReceiver extends BroadcastReceiver {public void onReceive(Context context, Intent intent) {if("LoginOut".equals(intent.getAction())){otherEquipmentLogin();  }}}
 private void otherEquipmentLogin() {final CommonDialog otherLoginDialog = new CommonDialog(BaseActivity.this);otherLoginDialog.setContent("您的账号已在其他设备登录,请重新登录!");otherLoginDialog.setTitle("警告");otherLoginDialog.setEnsure("重新登录");otherLoginDialog.setCancelable(false);otherLoginDialog.setCanceledOnTouchOutside(false);otherLoginDialog.setOnEnsureClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击重新登录,跳转到登录界面startActivity(LoginActivity.class);otherLoginDialog.dismiss();}});otherLoginDialog.setOnCancelClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击取消退出appexitApp();//杀死所有已创建的activity,退出应用otherLoginDialog.dismiss();}});otherLoginDialog.show();}

代码这样写是不是就行了,那就看看效果是不是我们想要的吧!

发现问题了吗?当我们打开多个界面时,每个activity都会弹出一个提示对话框,而我们仅需要最上面的activity弹出提示框而已!

​ 所以,我们需要加判断!

四、重要的判断

​ 我们在每次创建一个activity时,都会把该Activity加入到一个存放activity的列表中。而由于每个压在下面的activity都没有销毁,所以对他们来说。列表中存放的最后一个activity即是它们本身。所以我们可以这样判断

private void otherEquipmentLogin() {//如果列表中的最后一个activity 跟当前activity相同时,则可以弹出对话框if(activities.getLast().getClass()==this.getClass()){final CommonDialog otherLoginDialog = new CommonDialog(BaseActivity.this);otherLoginDialog.setContent("您的账号已在其他设备登录,请重新登录!");otherLoginDialog.setTitle("警告");otherLoginDialog.setEnsure("重新登录");otherLoginDialog.setCancelable(false);otherLoginDialog.setCanceledOnTouchOutside(false);otherLoginDialog.setOnEnsureClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//跳转到登录界面startActivity(LoginActivity.class);otherLoginDialog.dismiss();}});otherLoginDialog.setOnCancelClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击取消退出appexitApp();otherLoginDialog.dismiss();}});otherLoginDialog.show();}}

以上,就是们单点登录功能实现的过程,是不是很简单呢!!!

代码在这里

Android单点登录,互踢下线代码实现相关推荐

  1. Spring Security OAuth2 实现多人登录互踢下线

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 ▊ 老赵推荐(戳下方标题) 阿里大牛程序员的Java问题排查工具单 我已经不用 try catch 处理异常了!太烦人 ...

  2. SpringBoot集成单点登录-“被挤下线”

    SpringBoot配置单点登录 前言 你好,未来!上个周末过的还行,逛街逛到腿发软,生活还是要有仪式感,一生要待自己待你最亲近的人.周一休息,顺便看了看04版天龙八部,塑造了三位英雄人物,共同点:热 ...

  3. SpringSecurity整合springBoot、redis——实现登录互踢

    背景 基于我的文章--<SpringSecurity整合springBoot.redis token动态url权限校验>.要实现的功能是要实现一个用户不可以同时在两台设备上登录,有两种思路 ...

  4. Spring Security OAuth2 实现登录互踢

    Spring Security OAuth2 实现登录互踢 工作中遇到的问题,通过网上查找资料,解决问题,记录一下,防止丢失. 1.重写DefaultTokenServices中的方法 ​ 自定义一个 ...

  5. 单点登录(原理与代码)

    文章目录 一.单点登录简介 SSO 原理(单点登录的过程) SSO 实现技术 SSO 常见方案 二.手写单点登录系统架构(代码篇) 三.单点登录详介(原理篇) 1.登录 2.注销 单点登陆的具体实现: ...

  6. 单用户登录记录互踢下线思路

    单用户登录记录(只谈redis实现) 用户登录成功生成随机值(uuid或者雪花算法,随意)存在redis(假设key="token-user:token",值="user ...

  7. Cas实现子系统登录互踢

    实现思路 1.一个类,类中维护着一个已登录用户的map,每次登录取出上次该用户对应的session:并给session添加一个过期的属性标识lastHttpSession.setAttribute(B ...

  8. android 单点登录

    单点登录:同一个帐号不能同时在不同设备登录,如果A设备登录,然后B设备也用同一个帐号登录,A设备就会强制下线 服务端: 服务端需要集成Token,每次在app登录时为app分配新的token,如果在某 ...

  9. Java用Filter制作登录限制-踢下线防踢等

    Hello, 我是Shendi, 这次我给大家带来了 JavaWeb登录 限制登录 防踢  挤下线的功能实现 如题,很简单,我们需要编写一个Filter,就叫LoginFilter  实现javax包 ...

最新文章

  1. Java学习总结:23
  2. 基于用户投票的排名算法(五):威尔逊区间
  3. Navicat远程连接不上mysql解决方案
  4. QLibrary执行load失败
  5. Linux上的TIME_WAIT和tcp_fin_timeout
  6. 谷歌浏览器安装过程 0911
  7. 那些用Go实现的分布式事务框架
  8. swift开发网络篇—NSURLConnection基本使用
  9. 快速搭建一个前端模板
  10. OpenCV图像处理--EasyPR中文开源车牌识别系统
  11. minic 动作句型处理
  12. 随手写的一些好用的功能(不定时更新)
  13. 【SDUT第11周周赛Problem A】SDUT2576——Queen Collisions
  14. CTSCAPIO 2017游记
  15. 树莓派4 使用 SnowBoy 搭建热词唤醒
  16. ubuntu 22.04下载安装
  17. 长调用与短调用 调用门
  18. Synchronized解析——一层一层剥开洋葱的心
  19. 39岁阿里P9失业了,总资产1.5亿,真相是什么?
  20. 「1」线性代数(期末复习)

热门文章

  1. 有一种要见天日的感觉
  2. Linux 高级指令
  3. 国二c语言公共基础知识题库,国二C语言公共基础知识习题(答案)
  4. Linux操作系统下删除文件及目录命令
  5. WDA ALV组件复用自定义button,单元格修改
  6. 使用Managed DirectX编写游戏(-)
  7. 视频点播cdn加速\直播cdn加速解决方案
  8. Linux下的cal命令
  9. java计算机毕业设计某医院门诊预约系统源码+数据库+系统+lw文档+mybatis+运行部署
  10. 2003服务器硬盘陈列,Windows软阵列(磁盘阵列)视频教程