美文网首页
关于Android 退出登录与强制下线功能记录

关于Android 退出登录与强制下线功能记录

作者: 释校尉 | 来源:发表于2019-10-29 17:49 被阅读0次

一、前提介绍

1.退出登录功能:退出登录到用户登录界面

2.强制下线功能:退出登录到用户登录界面,不清除用户登录帐号密码

出现问题:两个功能同样代码,在退出登录正常,强制下线报msg's executing time is too long,最后解决办法如下

二、Activity管理类

class ActivityManager {

    private var activityStack:Stack<Activity>?= null// activity栈

// 把一个activity压入栈中

    fun pushOneActivity(actvity:Activity) {

        if (activityStack == null) {

            activityStack = Stack()

        }

        activityStack!!.add(actvity)

    }

    // 移除一个activity

    fun popOneActivity(activity:Activity?) {

        if (activityStack != null && activityStack!!.size > 0) {

            if (activity!= null) {

                activity.finish()

                activityStack!!.remove(activity)

            }

}

}

    // 退出所有activity

    fun finishAllActivity() {

        if (activityStack != null) {

            while (activityStack!!.size > 0) {

                activityStack!!.pop().finish()

            }

}

}

    /**

* 结束除指定类名的所有Activity

*/

    fun finishExcludeActivityAllActivity(cls:Class<*>) {

        for (activityin this.activityStack!!) {

            if (activity== null) continue

            if (activity.javaClass == cls) continue

            popOneActivity(activity)

        }

}

    companion object {

        private var instance:ActivityManager?= null

        // 单例模式

        fun getInstance():ActivityManager {

            if (instance == null) {

                instance = ActivityManager()

            }

            return instance as ActivityManager

        }

}

}

三、退出登录功能

退出登录按钮点击执行

//首先清除用户保存的数据

SPUtils.remove(Constant.SPConstant.CUR_USER_NAME)

SPUtils.remove(Constant.SPConstant.CUR_USER_SESSIONID)

SPUtils.remove(Constant.SPConstant.CUR_USER_ID)

Thread.sleep(500)

Log.e("登录2",LoginUser.name)

ActivityManager.getInstance().finishAllActivity()

startActivity(Intent(this, LoginActivity::class.java))

四、强制下线功能

强制下线功能是根据数据库唯一的sessionid来判断,以用户最后一次登录为准,强制下线采用广播通知。

<activity

    android:name=".activity.LoginActivity"

    android:launchMode="singleTop" //这块需要注意

    android:screenOrientation="portrait"

    android:theme="@style/SplashFullWindowTheme">

    <intent-filter>

        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />

    </intent-filter>

</activity>

LoginActivity界面跳转到别的界面,不使用finish()直接跳转,同时在界面初始化时需要添加

//销掉出登录界面外其余界面,防止第二次进入

ActivityManager.getInstance().finishExcludeActivityAllActivity(this::class.java)

强制下线弹出框中点击重新登录按钮执行

// 点击按钮所调用的方法

SPUtils.remove(Constant.SPConstant.CUR_USER_NAME)

SPUtils.remove(Constant.SPConstant.CUR_USER_SESSIONID)

SPUtils.remove(Constant.SPConstant.CUR_USER_ID)

startActivity(Intent(this@BaseMvpActivity, LoginActivity::class.java))

补充测试时会发现新的错误:java.util.ConcurrentModificationException异常

新的ActivityManager如下:

class ActivityManager {

    private var activityStack:Stack<Activity>?= null// activity栈

/**

* 将activity推入栈内

*

    * @paramactivity

    */

    fun pushOneActivity(activity:Activity) {

        if (activityStack == null) {

            activityStack = Stack()

        }

        activityStack!!.add(activity)

    }

    /**

* 将activity移出栈

*

    * @paramactivity

    */

    fun popOneActivity(activity:Activity?) {

        if (activity!= null) {

            activityStack!!.remove(activity)

        }

}

    /**

* 结束指定activity

*

    * @paramactivity

    */

    @Suppress("NAME_SHADOWING")

    fun endActivity(activity:Activity?) {

        val activity= activity

if (activity!= null) {

            activity.finish()

            activityStack!!.remove(activity)

        }

}

    /**

* 获得当前的activity(即最上层)

*

    * @return

*/

    fun currentActivity():Activity?{

        var activity:Activity?= null

        if (!activityStack!!.empty())

            activity= activityStack!!.lastElement()

        return activity

}

    /**

* 弹出除cls外的所有activity

*

    * @paramcls

    */

    fun popAllActivityExceptOne(cls:Class<out Activity>) {

        while (true) {

            val activity= currentActivity() ?:break

            if (activity.javaClass == cls) {

                break

            }

            popOneActivity(activity)

        }

}

    /**

* 结束除cls之外的所有activity,执行结果都会清空Stack

*

    * @paramcls

    */

    fun finishAllActivityExceptOne(cls:Class<out Activity>) {

        while (!activityStack!!.empty()) {

            val activity= currentActivity()

            if (activity!!.javaClass == cls) {

                popOneActivity(activity)

            } else {

                endActivity(activity)

            }

}

}

    /**

* 结束所有activity

*/

    fun finishAllActivity() {

        while (!activityStack!!.empty()) {

            val activity= currentActivity()

            endActivity(activity)

        }

}

    companion object {

        private var instance:ActivityManager?= null

        // 单例模式

        fun getInstance():ActivityManager {

            if (instance == null) {

                instance = ActivityManager()

            }

            return instance as ActivityManager

        }

}

}

在登录页面使用

//销掉出登录界面外其余界面,防止第二次进入

ActivityManager.getInstance().finishAllActivityExceptOne(this::class.java)

其余没变

完结

相关文章

  • 关于Android 退出登录与强制下线功能记录

    一、前提介绍 1.退出登录功能:退出登录到用户登录界面 2.强制下线功能:退出登录到用户登录界面,不清除用户登录帐...

  • 六.App强迫下线的实现

    前言 在Android开发过程中,最常见的功能便是“异地登录,强制下线”了。那么,今天就讲讲用广播实现"强迫下线"...

  • * 实践:强制下线功能

    强制下线功能应该算是比较常见的了,很多的应用程序都具备这个功能,比如你的 QQ 号在别处登录了,就会将你强制挤下线...

  • android使用广播实现强制下线功能

    强制下线是我们常见的功能,比如QQ在别处登录了,就会将你强制挤下线。思路是在界面上添加一个对话框,让用户无法进行其...

  • Linux查看登录用户

    查看登录用户 显示当前全部的登录用户 强制下线其他用户 root用户可以使其他用户强制下线,例如关闭登录在pts/...

  • Android笔记汇总目录

    一、Android基础 Broadcast Receiver 广播的最佳实践——实现强制下线功能 数据库 实战Li...

  • 说说在 Android 中如何实现强制下线功能

    在应用程序中的一个常见功能是 “强制下线”。比如 QQ 号在别处登录后,就会把当前的 QQ 号挤下线。实现思路是:...

  • Android:强制下线

    实现异地登录强制下线:一、环信 1、集成环信SDK,实现网络监听接口,对连接状态进行监听2、可以根据 discon...

  • Android开发中强制下线功能实现

    强制下线的应用场景很多, 比如我们好多账号都有抢登的显现, 会被挤下线. 实现效果: 源码: https://gi...

  • Android 强制下线实现

    0,今天完成的任务 广播的实现---强制下线功能 1,效果展示 2,实现原理 发送广播-->关闭所有的活动-->开...

网友评论

      本文标题:关于Android 退出登录与强制下线功能记录

      本文链接:https://www.haomeiwen.com/subject/cxpgvctx.html