广播实现强制下线功能

Posted z啵唧啵唧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了广播实现强制下线功能相关的知识,希望对你有一定的参考价值。

实现强制下线功能

  • 强制下线应该是一个比较常用的功能,比如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()
    

  • 然后创建一个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)
    

  • 编写一个用于登录的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()
            
        
    

<?xml version="1.0" encoding="utf-8"?>
<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>
  • 加入强制下线功能,修改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)
        
    

<?xml version="1.0" encoding="utf-8"?>
<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>
  • 我们通过按钮的点击事件发送了一条广播,广播的值为com.zb.broadcastbestpractice.FORCE_OFFLINE,这条广播就意在通知程序强制用户下线
  • 强制用户下线的逻辑并不是写在MainActivity当中的,而是应该写在接收这条广播的BroadcastReceiver当中
  • 这样不管在任何的地方,只要发送一条广播,就可以完成强制下线得操作了
  • 创建一个BroadcastReceiver来接收这条强制下线的广播
  • 在BaseActivity当中动态注册一个BroadcastReceiver,因为所有的Activity都继承自BaseActivity,那么每个Activity都可以接收这条广播了.
  • 编写一个ForceOfflineReceiver继承BroadcastReceiver,在onReceive当中编写具体的广播逻辑

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

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

  • 效果展示


以上是关于广播实现强制下线功能的主要内容,如果未能解决你的问题,请参考以下文章

Android学习之基础知识八—Android广播机制实践(实现强制下线功能)

详解广播机制,Broadcast Receiver,Android进阶必备知识。(附使用广播实现一键强制下线功能)

android: 实现强制下线功能

android 利用广播实现程序的强制退出

安卓实现QQ强制下线----来自第一行代码

Eureka 系列(07)服务注册与主动下线