《第一行代码 第3版》学习笔记——第六章 广播

1 概述

广播概念在计算机网络中就有,在一个IP网络范围中,最大的IP地址通常是被保留作为广播地址来使用的。
广播的含义就是一个广播发出,范围内的应用程序都能够收到该广播。
Android中的每个应用程序都可以对自己感兴趣的广播进行注册,注册后当广播发出时,就能够收到,可能是系统广播,也可能是其他应用程序的广播。
广播接收的应用中需要有类来继承BroadcastReceiver类。
广播按照分类可以分为两种:

  • 标准广播:完全异步执行的广播,广播发出后,所有相关的BroadcastReceiver能够几乎在同一时间收到广播消息,没有先后顺序可言。这种广播效率较高,无法被截断。
  • 有序广播:是一种同步执行的广播,同一时刻只会有一个BroadcastReceiver收到广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才会继续传递。

2 接收系统广播

2.1 动态注册监听时间变化

BroadcastReceiver属于Android四大组件之一,使用时需要注册,可以分为两种方式注册,在代码中注册是动态注册,在AndroidManifest.xml中注册是静态注册。

class MainActivity : ComponentActivity() {
   
    lateinit var timeChangeReceiver: BroadcastReceiver
    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        timeChangeReceiver = object : BroadcastReceiver() {
   
            override fun onReceive(context: Context?, intent: Intent?) {
   
                val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
                val date = Date(System.currentTimeMillis())
                val dateStr = dateFormat.format(date)
                Toast.makeText(context, "Now: $dateStr", Toast.LENGTH_SHORT)
                    .show()
            }
        }
        val intentFilter = IntentFilter("android.intent.action.TIME_TICK")
        registerReceiver(timeChangeReceiver, intentFilter)
    }

    override fun onDestroy() {
   
        super.onDestroy()
        unregisterReceiver(timeChangeReceiver)
    }
}

这里监听系统广播TIME_TICK,每一分钟,系统会发送一次该广播。在onCreate中注册,在onDestroy中注销,动态注册要记得注销。
在这里插入图片描述
Android提供了多种系统广播,查看完整的系统广播列表,可以到以下路径查看:
<Android SDK>/platforms/<api version>/data/broadcast_actions.txt

2.2 静态注册实现开机启动

动态注册的BroadcastReceiver可以自由的控制注册与注销,灵活性上有很大的优势,但是必须程序启动后才能够接收广播。静态注册则可以在程序未启动时注册广播。

class BootCompleteReceiver : BroadcastReceiver() {
   

    override fun onReceive(context: Context, intent: Intent) {
   
        Toast.makeText(context, "BootCompleteReceiver: Boot completed", Toast.LENGTH_LONG).show()
    }
}

AndroidManifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

静态注册并声明对应权限
在这里插入图片描述
当系统启动完成时,会收到系统广播
需要注意的是,不要在onReceive方法中添加过多的逻辑或者进行任何耗时操作,因为BroadcastReceiver中是不允许开启线程的,当onReceive方法运行了较长时间而没有结束时,程序会出现错误。

3 发送自定义广播

3.1 发送标准广播

自定义广播,并发送广播。自定义就是定义广播的action

class MainActivity : ComponentActivity() {
   
    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContent {
   
            BroadcastDemoTheme {
   
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier,
             
### 关于郭霖《第一行代码》第三第二章的学习笔记 在郭霖的《第一行代码》第三中,第二章主要围绕 Android 应用的基础概念展开,介绍了如何创建第一个 Android 项目以及理解项目的结构。以下是基于已有引用内容和专业知识整理的相关学习笔记: #### 创建 Android 项目 为了开发 Android 应用程序,开发者需要准备必要的工具并搭建开发环境。这些工具包括但不限于 JDK (1.8 或更高本)[^1]、Android SDK 和集成开发环境 Android Studio[^1]。 一旦安装完成,可以通过 Android Studio 的向导界面来创建一个新的 Android 项目。在此过程中,开发者可以选择目标设备类型(如手机和平板)、设置最低支持的 API 本(通常建议从 API 15 开始,即 Android 4.0),以及其他配置选项[^3]。 #### 理解 Android 项目结构 新创建的 Android 项目会自动生成一系列文件夹和文件,其中一些重要的部分包括: - **`app/src/main/java/`**: 存放 Java/Kotlin 源码的地方。 - **`res/` 文件夹**: 资源目录,用于存储布局 XML 文件、图片资源和其他静态数据。 - **`AndroidManifest.xml`**: 定义应用程序的核心元信息,比如活动组件 (`Activity`) 和权限声明。 #### 显式与隐式 Intent 的使用 Intent 是 Android 中一种非常重要的机制,用来描述一个操作的动作及其携带的数据。当通过 `Intent(context, TargetClass.class)` 这种方式指定要跳转的目标 Activity 时,则称为显式 Intent[^2];相对应地,如果仅指定了动作类别或者 MIME 类型而不具体指向某个 Component,则属于隐式 Intent。 #### 多线程处理简介 对于耗时较长的操作,应该避免阻塞主线程以免影响用户体验。为此可以利用多线程技术,在后台执行复杂计算或网络请求等工作负载。最简单的做法就是继承 Thread 类重载 run 方法,或者是实现 Runnable 接口并将其实例传递给新的 Thread 对象实例化之后调用 start 方法即可开启子线程运行相应任务[^4]。 ```java // 实现Runnable接口的方式启动线程 new Thread(new Runnable() { @Override public void run() { // 执行耗时操作 } }).start(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值