Android 利用广播实现强制下线的功能————第一行代码

625 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

展示

在这里插入图片描述

例子下载

download.csdn.net/download/lj…

思路

   1. 首先我们需要使用广播,发送一条广播,来说明需要强制下线    2. 需要注册广播,当接收到这条广播以后,弹出对话框,然后finish()所有的activity,然后跳转到LoginActivity。但是现在不知道会在哪个activity中接收到这条广播,所以我们需要定义一个BaseActivity。然后在BaseActivity中注册和销毁广播接收器

代码实现
1.工具类 ActivityCollector
import android.app.Activity

object ActivityCollector {
    private val activities = ArrayList<Activity>()
    //添加
    fun addActivity(activity: Activity) {
        activities.add(activity)
    }
    //移除
    fun removeActivity(activity: Activity) {
        activities.remove(activity)
    }
    //finish 所有
    fun finishAll() {
        for (activity in activities) {
            if (!activity.isFinishing) {
                activity.finish()
            }
        }
        activities.clear()
    }

}
2. BaseActivity
import android.content.*
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import com.example.kotlindemo4.LoginActivity

open class BaseActivity : AppCompatActivity() {

    private lateinit var receiver: OfflineReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ActivityCollector.addActivity(this)
    }

    /**
     * 在onResume方法中注册,代表只有在栈顶的activity才需要注册
     */
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter("com.example.bddemo.OFFLINE")
        receiver = OfflineReceiver()
        registerReceiver(receiver, intentFilter)
    }
    /**
     * 当activity退出栈顶,就不需要该广播了,所以在onPause中取消
     */
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }

    override fun onDestroy() {
        super.onDestroy()
        ActivityCollector.removeActivity(this)
    }
    inner class OfflineReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {

            if (context != null) {
                AlertDialog.Builder(context).apply {
                    setTitle("提示")
                    setMessage("你的帐号在别处登录,请重新登录")
                    setCancelable(false)
                    setPositiveButton("确定") { _, _ ->
                        ActivityCollector.finishAll()
                        val i = Intent(context, LoginActivity::class.java)
                        context.startActivity(i)

                    }
                    create()
                    show()
                }
            }
        }
    }
}

3. MainActivity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.bddemo.BaseActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btn_out.setOnClickListener {
            val intent = Intent("com.example.bddemo.OFFLINE")
            sendBroadcast(intent)
        }
    }
}