![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XGjtgSOG-1669641957807)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221127205122897.png)]](https://1000bd.com/contentImg/2024/04/17/5519d7694256819d.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjYlgzGj-1669641957809)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221127205540473.png)]](https://1000bd.com/contentImg/2024/04/17/3447692d8c80fbda.png)
package com.zb.broadcasttest
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
class MainActivity : AppCompatActivity() {
lateinit var timeChangeReceiver: TimeChangeReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//创建一个IntentFilter实例
val intentFilter = IntentFilter()
//给IntentFilter实例添加一个值为"android.intent.action.TIME_TICK"的acton
//表示系统发出的正是一条值为"android.intent.action.TIME_TICK"的广播
//也就是说我们的BroadcastReceiver想要简单的是什么广播,就在这里添加什么的action
intentFilter.addAction("android.intent.action.TIME_TICK")
//创建一个TimeChangeReceiver的实例
timeChangeReceiver = TimeChangeReceiver()
//调用registerReceiver()方法进行注册
registerReceiver(timeChangeReceiver, intentFilter)
//这样TimeChangeReceiver就会接收到所有值为"android.intent.action.TIME_TICK"的广播了,也就是是实现了监听了系统时间变化的功能
}
override fun onDestroy() {
super.onDestroy()
//需要注意的是,动态注册的BroadcastReceiver一定要记得取消注册
unregisterReceiver(timeChangeReceiver)
}
//定义一个内部类TimeChangeReceiver内部类
inner class TimeChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//简单使用Toast提示一段文本信息
Toast.makeText(context, "Time has change", Toast.LENGTH_SHORT).show()
}
}
}
/platforms/<任意 android api 版本>/data/broadcast_actions.txt
动态注册BroadcastReceiver可以自由地控制注册和注销,比较具有灵活性
但是存在一个缺点就是,必须在程序启动之后才能接收广播,因为注册的逻辑是写在onCreate()方法中的.
当我们需要让程序在未启动的情况下依然可以接收广播,我们就可以使用到静态注册的方式
在之前动态注册能够接受的广播,静态注册也同样可以进行接收,但是由于大量的恶意应用利用这个机制在程序未启动的情况下监听系统广播,从而使任何应用都可以从后台被唤醒,从而影响了用户手机的电量和性能
因此每个版本的Android系统都在削弱这个静态注册的功能
在安卓8.0版本之后的系统,所有的隐式广播都不允许使用静态注册的方式进行注册了
隐式广播指的是没有具体指定发送给哪个应用程序的广播,而大多数的广播都属于是隐式广播
目前只有少部分特殊的广播支持静态注册的方式来接收
这些特殊的广播可以列表可以参考:
其中有一条为开机广播:
android.intent.action.BOOT_COMPLETED
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F0wFNQN7-1669641957810)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221128205031421.png)]](https://1000bd.com/contentImg/2024/04/17/40a78c2d7232f432.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N2PhHhmm-1669641957812)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221128205336898.png)]](https://1000bd.com/contentImg/2024/04/17/91990935b1f207bf.png)
package com.zb.broadcasttest
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.widget.Toast
class BootCompleteReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "Boot complete", Toast.LENGTH_SHORT).show()
}
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XxXpbaMz-1669641957813)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221128211339692.png)]](https://1000bd.com/contentImg/2024/04/17/594210a366bf3812.png)
<uses-permission android:name="android.intent.action.BOOT_COMPLETED" />