本文已参与「新人创作礼」活动,一起开启掘金创作之路。
展示
例子下载
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)
}
}
}