• 广播实现强制下线功能


    实现强制下线功能

    • 强制下线应该是一个比较常用的功能,比如QQ在比的地方被登陆了,就会强制比被挤下线.
    • 强制下线的功能还是比较简单的,只需要在界面上弹出一个框,告知用户无法再进行任何操作即可.只能点击确定然后跳转至登录界面.
    • 强制下线功能需要关闭所有的Activity,然后返回到登录界面
    • 先编写一个ActivityCollector类用来管理所有的Activity
    object ActivityCollector {
        private val activities = ArrayList<Activity>()
    
        fun addActivity(activity: Activity) {
            activities.add(activity)
        }
    
        fun removeActivity(activity: Activity) {
            activities.remove(activity)
        }
    
        fun finishAll() {
            for (activity in activities) {
                if (!activity.isFinishing()) {
                    activity.finish()
                }
            }
            activities.clear()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 然后创建一个BaseActivity作为所有Activity的父类
    open class BaseActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            ActivityCollector.addActivity(this)
        }
    
        override fun onDestroy() {
            super.onDestroy()
            ActivityCollector.removeActivity(this)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 编写一个用于登录的Activity以及对应的xml布局文件
    class LoginActivity : BaseActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_login)
            login.setOnClickListener {
                //先从Edit当中获取账户名和密码
                val account = accountEdit.text.toString()
                val password = passwordEdit.text.toString()
                //验证账户名和密码的逻辑
                if (account == "admin" && password == "123456") {
                    //如果账号和密码都没有问题,那么就跳转到MainActivity
                    val intent = Intent(this, MainActivity::class.java)
                    startActivity(intent)
                    finish()
                } else {
                    //使用Toast提示一段账号或者密码错误的文本
                    Toast.makeText(this, "account or password is invalid", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:orientation="vertical">
    
            <TextView
                android:layout_width="90dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:text="Account:"
                android:textSize="18sp" />
    
            <EditText
                android:id="@+id/accountEdit"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="1" />
        LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:orientation="vertical">
    
            <TextView
                android:layout_width="90dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:text="Password:"
                android:textSize="18sp" />
    
            <EditText
                android:id="@+id/passwordEdit"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="1" />
        LinearLayout>
    
        <Button
            android:id="@+id/login"
            android:layout_width="200dp"
            android:layout_height="60dp"
            android:layout_gravity="center_horizontal"
            android:text="Login" />
    
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 加入强制下线功能,修改activity_main.xml和MainActivity当中的代码
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            forceOffline.setOnClickListener {
                val intent = Intent("com.zb.broadcastbestpractice.FORCE_OFFLINE")
                sendBroadcast(intent)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/forceOffline"
            android:text="Send force offline broadcast"/>
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 我们通过按钮的点击事件发送了一条广播,广播的值为com.zb.broadcastbestpractice.FORCE_OFFLINE,这条广播就意在通知程序强制用户下线
    • 强制用户下线的逻辑并不是写在MainActivity当中的,而是应该写在接收这条广播的BroadcastReceiver当中
    • 这样不管在任何的地方,只要发送一条广播,就可以完成强制下线得操作了
    • 创建一个BroadcastReceiver来接收这条强制下线的广播
    • 在BaseActivity当中动态注册一个BroadcastReceiver,因为所有的Activity都继承自BaseActivity,那么每个Activity都可以接收这条广播了.
    • 编写一个ForceOfflineReceiver继承BroadcastReceiver,在onReceive当中编写具体的广播逻辑

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ZYGOAgZ-1669710312794)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221129155650298.png)]

    • 注册和取消注册的代码逻辑

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hI6wCWyt-1669710312796)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221129155807675.png)]

    • 在AndroidManifest.xml当中修改一下代码,将登录界面设置成为主界面

    在这里插入图片描述

    • 效果展示
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 相关阅读:
    新建SpringCloud电商前端Vant项目
    linux 下vi/vim使用
    华为云云耀云服务器L实例评测|云耀云服务器L实例部署ZFile在线网盘服务
    《红蓝攻防对抗实战》一. 隧道穿透技术详解
    【PostgreSQL启动,停止命令(重启)】
    Linux 下升级 OpenSSH 到 9.x 版本对 scp 影响
    自动化测试工具ANSIM,实现4/5/6G核心网产品高效交付
    如何在大数据集群中手工增加一个节点
    Dubbo和SpringCloud对比
    设计模式——装饰器模式
  • 原文地址:https://blog.csdn.net/weixin_45809829/article/details/128100589