Android 利用廣播實現強制下線的功能————第一行代碼

展示

在這裏插入圖片描述

例子下載

https://download.csdn.net/download/ljp345775/12481698

思路

   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)
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章