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

安卓开发_广播机制_发送自定义广播

安卓开发_广播机制_发送自定义广播

  • 发送标准广播
  • 发送有序广播
  • 参考

发送标准广播

新建一个MyBroadcastReceiver用于接收广播, 代码如下:

class MyBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show()
    }
}

再AndroidManifest.xml中修改MyBroadcastReceiver, 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    ...

    <application
        ...>

        <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST" />
            </intent-filter>
        </receiver>
        ...
    </application>

</manifest>

定义一个用于发送广播的按钮, 代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send Broadcast"
        />
</LinearLayout>

给按钮加入发送自定义广播的逻辑, 代码如下:

class MyActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMyBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMyBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 发送标准广播
        binding.button1.setOnClickListener {
            val intent = Intent("com.example.broadcasttest.MY_BROADCAST")

            // 指定要发送给哪个程序后, 才会变成显示广播, 静态注册的Broadcast才可以接收到这条广播
            intent.setPackage(packageName)
            sendBroadcast(intent)
        }
    }
}

发送有序广播

再创建一个新的BroadcastReceiver, 代码如下:

class AnotherBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "received in AnotherBroadcastReceiver", Toast.LENGTH_SHORT).show()
    }

}

在AndroidManifest.xml中修改AnotherBroadcastReceiver,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    ...

    <application
        ...>
        <receiver
            android:name=".AnotherBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST" />
            </intent-filter>
        </receiver>

        ...
    </application>

</manifest>

此时点击"Send Broadcast", 会分别弹出俩次提示信息.

接下来再定义一个按钮并添加逻辑, 代码如下:

class MyActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMyBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMyBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 发送有序广播
        binding.button2.setOnClickListener{
            val intent = Intent("com.example.broadcasttest.MY_BROADCAST")
            // 第二个参数是一个与权限相关的字符串
            sendOrderedBroadcast(intent, null)
        }
    }
}

设定BroadcastReceiver的先后顺序, 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        ...>
        <receiver
            ...>
            <intent-filter android:priority="100">
                ...
            </intent-filter>
        </receiver>
    </application>

</manifest>

修改MyBroadcastReceiver中的代码, 代码如下所示:

class MyBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show()
        // 截断广播
        abortBroadcast()
    }
}

参考

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


http://www.kler.cn/a/15642.html

相关文章:

  • 【人工智能】迁移学习在深度学习中的应用:用Python实现自定义数据集图像分类
  • 2024-11-16 串的存储结构
  • ISP是什么?
  • Amazon Web Services (AWS)
  • 一个win32 / WTL下多线程库(CThread类)的使用心得
  • GEE下载ERA5-Land气象数据(1950-至今,降水、温度)
  • RK3399平台开发系列讲解(LED子系统篇)LED子系统详解
  • Apache Zeppelin系列教程第一篇——安装和使用
  • springboot+nodejs+vue众筹项目管理系统平台系统
  • VUE入门神器
  • jvm调优策略
  • 牛客网Python入门103题练习|【07--循环语句(1)】
  • C语言入门篇——指针篇
  • ddp pytoch多卡分布式训练
  • Vue3之setup参数介绍
  • Java学习过程(韩顺平661-665)
  • 浅谈测试用例设计 | 京东云技术团队
  • 【HQL - 查询用户的累计消费金额及VIP等级】
  • 霍兰德人格分析雷达图
  • 【Qt】根据界面所在显示器自适应调整ui大小
  • 省钱!NewBing硬核新玩法;手把手教你训练AI模特;用AI替代同事的指南;B站最易上手AI绘画教程 | ShowMeAI日报
  • Raft 共识算法4-选举限制
  • 【JavaEE初阶】多线程(四)阻塞队列 定时器 线程池
  • async函数学习总结
  • Navicat和Dbeaver有什么区别
  • Java --- springboot2的静态资源配置原理