Android 第二十八章 BroadcastReceiver

一、继承

java.lang.Object
↳ android.content.BroadcastReceiver

二、简介

  1. BroadcastReceiver:Android四大组件之一,主要用于接收广播和发送广播
  2. 标准广播:发送广播,所有广播接收器都能收到广播
  3. 有序广播:发送广播,按照广播接收器设置的顺序接收,前一个广播接收器可以截断广播

三、公共方法

  1. setResultCode(int code) 设置广播的结果代码;仅适用于通过Context.sendOrderedBroadcast发送的广播
  2. getResultCode() 获取由前一个接收器设置的结果代码
  3. setResultData(String data) 设置广播的结果数据;仅适用于通过Context.sendOrderedBroadcast发送的广播
  4. getResultData() 获取由前一个接收器设置的结果数据
  5. setResultExtras(Bundle extras) 设置广播的结果附加内容;仅适用于通过Context.sendOrderedBroadcast发送的广播。
  6. getResultExtras(boolean makeMap) 获取由前一个接收器设置的结果额外数据
  7. setResult(int code, String data, Bundle extras) 设置广播返回的所有结果数据;仅适用于通过Context.sendOrderedBroadcast发送的广播。
  8. getAbortBroadcast() 获取当前广播接收器是否中止
  9. abortBroadcast() 设置指示此接收器应中止当前广播的标志;仅适用于通过Context.sendOrderedBroadcast发送的广播。这将阻止任何其他广播接收器接收广播。
  10. clearAbortBroadcast() 清除指示此接收器应中止当前广播的标志。
  11. goAsync() 这可以由onReceive中的应用程序调用,以允许它在从该函数返回后保持广播活动。作为一般规则,广播接收器被允许运行长达10秒,然后系统会认为它们没有响应,并对应用程序进行ANR
  12. peekService(Context myContext, Intent service) 为已绑定的服务提供绑定器。此方法是同步的,如果不存在,则不会启动目标服务,因此从onReceive调用是安全的。peecService()要返回一个非null的IBinder接口,该服务必须在之前发布过它。换句话说,某个组件必须调用了Context.bindService(Intent,ServiceConnection,int)
  13. isOrderedBroadcast() 如果接收器当前正在处理已排序的广播,则返回true
  14. isInitialStickyBroadcast() 如果接收器当前正在处理粘性广播的初始值,即上次广播且当前保存在粘性缓存中的值,则返回true,因此这不是当前广播的直接结果。
  15. setDebugUnregister(boolean debug) 控制包含对Context.registerReceiver()的不匹配调用的调试帮助
  16. getDebugUnregister() 返回给setDebugUnregister的最后一个值

四、标准广播

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.BroadcastReceiverDemo"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>

        <receiver
            android:name=".TestBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="test" />
            </intent-filter>
        </receiver>
    </application>


</manifest>
class TestBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (null != intent) {
            var data = intent.getStringExtra("data")
            Log.d("data", data + "");
        }
    }
}
class MainActivity : AppCompatActivity() {

    lateinit var btn_send: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()
        initData()
        initClick()
    }

    private fun initView() {
        btn_send = findViewById(R.id.btn_send)
    }

    private fun initData() {
    }

    private fun initClick() {
        btn_send.setOnClickListener {
            val intent = Intent("test")
            intent.putExtra("data", "123")
            sendBroadcast(intent)
        }
    }


}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送广播"
        android:textSize="30sp" />

</LinearLayout>

五、有序广播

package com.empty.demo

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log

class TestBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (null != intent) {
            var data = intent.getStringExtra("data")
            Log.d("TestBroadcastReceiver", data + "");
        }
        //终止之后广播接收器
        abortBroadcast()
    }
}
class Test1BroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        if (null != intent) {
            var data = intent.getStringExtra("data")
            Log.d("Test1BroadcastReceiver", data + "");
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.BroadcastReceiverDemo"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>

        <receiver
            android:name=".TestBroadcastReceiver"
            android:exported="true">
            <intent-filter android:priority="1">
                <action android:name="test" />
            </intent-filter>
        </receiver>

        <receiver
            android:name=".Test1BroadcastReceiver"
            android:exported="true">
            <intent-filter android:priority="0">
                <action android:name="test" />
            </intent-filter>
        </receiver>

    </application>


</manifest>
class MainActivity : AppCompatActivity() {

    lateinit var btn_send: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()
        initData()
        initClick()
    }

    private fun initView() {
        btn_send = findViewById(R.id.btn_send)
    }

    private fun initData() {
    }

    private fun initClick() {
        btn_send.setOnClickListener {
            val intent = Intent("test")
            intent.putExtra("data", "123")
            sendOrderedBroadcast(intent,null)
        }
    }


}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送广播"
        android:textSize="30sp" />

</LinearLayout>

六、广播注册

静态注册

 <receiver
	android:name=".TestBroadcastReceiver"
	android:exported="true">
		<intent-filter android:priority="1">
		<action android:name="test" />
		</intent-filter>
</receiver>

动态注册

val testBroadcastReceiver = TestBroadcastReceiver()
val filter = IntentFilter();
filter.addAction("test")
registerReceiver(testBroadcastReceiver, filter);
        
//注销广播
unregisterReceiver(testBroadcastReceiver)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值