当前位置: 首页 > news >正文

安卓开发_广播机制_广播的最佳实践:实现强制下线功能

安卓开发_广播机制_广播的最佳实践:实现强制下线功能

  • ActivityCollector类用于管理所有的Activity
  • BaseActivity类作为所有Activity的父类
  • 创建一个LoginActivity来作为登录界面
    • 布局
    • LoginActivity
  • 在MainActivity中加入强制下线功能
    • 布局
    • MainActivity
    • 在BaseActivity中注册广播接收
    • 将LoginActivity注册为主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)}
}

创建一个LoginActivity来作为登录界面

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="60dp"><TextViewandroid:layout_width="90dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textSize="18sp"android:text="Account:" /><EditTextandroid:id="@+id/accountEdit"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical" /></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="60dp"><TextViewandroid:layout_width="90dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textSize="18sp"android:text="Password:" /><EditTextandroid:id="@+id/passwordEdit"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical"android:inputType="textPassword" /></LinearLayout><Buttonandroid:id="@+id/login"android:layout_width="200dp"android:layout_height="60dp"android:layout_gravity="center_horizontal"android:text="Login" />
</LinearLayout>

LoginActivity

class LoginActivity : AppCompatActivity() {private lateinit var binding: ActivityLoginBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityLoginBinding.inflate(layoutInflater)setContentView(binding.root)binding.login.setOnClickListener {val account = binding.accountEdit.text.toString()val password = binding.passwordEdit.text.toString()if(account == "admin" && password == "123456"){val intent = Intent(this, MainActivity::class.java)startActivity(intent)finish()}else{Toast.makeText(this, "account or password is invaild", Toast.LENGTH_SHORT).show()}}}
}

在MainActivity中加入强制下线功能

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><Buttonandroid:id="@+id/forceOffline"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Send force offline broadcast" />
</LinearLayout> 

MainActivity

class MainActivity : BaseActivity() {private lateinit var binding: ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)binding.forceOffline.setOnClickListener {val intent = Intent("com.example.broadcastbestpractice.FORCE_OFFLINE")sendBroadcast(intent)}}
}

在BaseActivity中注册广播接收

open class BaseActivity : AppCompatActivity() {private lateinit var receiver: ForceOfflineReceiveroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)ActivityCollector.addActivity(this)}override fun onResume() {super.onResume()val intentFilter = IntentFilter()intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE")receiver = ForceOfflineReceiver()registerReceiver(receiver, intentFilter)}override fun onPause() {super.onPause()unregisterReceiver(receiver)}override fun onDestroy() {super.onDestroy()ActivityCollector.removeActivity(this)}inner class ForceOfflineReceiver: BroadcastReceiver(){override fun onReceive(context: Context, intent: Intent) {AlertDialog.Builder(context).apply{setTitle("Warining")setMessage("You are forced to be offline. Please try to login again.")setCancelable(false)setPositiveButton("OK") { _, _ ->ActivityCollector.finishAll()val i = Intent(context, LoginActivity::class.java)context.startActivity(i)}show()}}}
}

将LoginActivity注册为主Activity

参考

郭霖. 《第一行代码 Android 第3版》

http://www.lryc.cn/news/63910.html

相关文章:

  • 国民技术N32G430开发笔记(10)- IAP升级 Application 的制作
  • [计算机图形学]材质与外观(前瞻预习/复习回顾)
  • Java 的简要介绍及开发环境的搭建(超级详细)
  • 每天一道算法练习题--Day15 第一章 --算法专题 --- -----------二叉树的遍历
  • golang - 函数的使用
  • 真题详解(极限编程)-软件设计(六十一)
  • 计算机网络笔记:TCP粘包
  • Vue(标签属性:ref、配置项:props、混入mixin、插件、样式属性:scroped)
  • 数仓建设规划核心问题!
  • 容器镜像的导入导出
  • Java每日一练(20230502)
  • JVM学习(九):堆
  • golang - switch
  • 浙大数据结构与算法一些有意思的理论基础题
  • 【热门框架】Mybatis-Plus怎样进行映射匹配兼容?Mybatis-Plus的ID有哪些生成策略
  • Http1.0 、1.1、2.0、3.0的区别
  • Python——基于YOLOV8的车牌识别(源码+教程)
  • c# 数据保存为PDF(一) (spire pdf篇)
  • Stable Diffusion使用方法
  • 高性能:负载均衡
  • Matplotlib 安装介绍
  • DNS:关于 DNS 基本概念的一些笔记整理
  • 机器人学一些知识
  • 应用,auto,内联函数
  • Flask框架的学习---01
  • 免费gpt-4-国内使用gpt-4
  • 《程序员面试金典(第6版)面试题 16.09. 运算
  • asp.net基于web的校园美食派送配送系统
  • 【JAVA】#详细介绍!!! 文件操作之File对象(1)!
  • Vue基本的内置指令