文章目錄
-
-
-
-
- 展示
- 例子下載下傳
- 思路
- 代碼實作
-
- 1.工具類 ActivityCollector
- 2. BaseActivity
- 3. MainActivity
-
-
-
展示
例子下載下傳
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)
}
}
}