BroadCastReceiver广播接受者(动态和静态)

文章详细介绍了Android中的广播接收者BroadcastReceiver的作用,特别是在Android7.0后动态注册广播的必要性。动态注册广播具有生命周期依赖,可在Activity创建时注册,销毁时卸载,提供更大的灵活性。静态注册则使广播接收器在应用关闭时仍能接收广播,适合全局监听。文章还展示了动态注册和静态注册的示例代码。

问题:

为什么学习广播接受者

Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播。

BroadCastReceiver(广播接收器),属于Android四大组件之一,在Android开发中,BroadCastReceiver的应用场景非常多,一般用于组件间通信。

解决问题需要运用知识点:

广播生命周期,有序、无序广播,系统广播,自定义广播。

广播接受者有两种注册方法:动态注册,静态注册

定义:广播是应用于系统、应用、控件、线程间消息响应的组件。

使用广播思路分析:

创建广播接收者BroadCastReceiver类

注册广播接受者(静态或动态,常用动态注册)

调用sendBroadcast()方法发送广播

onReceiver(Context context,Intent intent)方法处理广播

重点:为什么要动态注册广播

1.在Android7.0之前我们只需要静态注册一下广播就可以实现实时监听网络状态的变化;

2.但是在Android7.0之后,如果我们需要实时监听监听网络状态变化,需要动态注册广播;

静态注册和动态注册的区别

动态注册:

1.广播会跟Activity的生命周期结束而结束;

2.自由的控制注册和取消,有很大的灵活性。

静态注册:

1.广播不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接收广播;

2.全局的广播。

使用广播思路分析:

1.创建广播接收者BroadCastReceiver类

2.onCreate方法中注册/onDestroy方法中解除注册(不需要在清单文件中注册)

3.调用sendBroadcast()方法发送广播

4.onReceiver(Context context,Intent intent)方法处理广播

动态注册:

static TextView tv1;
    MyReceiver myReceiver;
    public static Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg.what == 200) {
                String str = msg.obj.toString();
                Log.i("--ss", "handleMessage: "+str);
                tv1.setText(str);
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = findViewById(R.id.tv1);
        myReceiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.bw.wpc");
        registerReceiver(myReceiver,intentFilter);
    }

    public void senddata(View view) {
        Intent intent1 = new Intent();
        intent1.setAction("com.bw.wpc");
        Bundle bundle = new Bundle();
        bundle.putString("name","张学友");
        intent1.putExtras(bundle);
        sendBroadcast(intent1);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
@Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("com.bw.wpc")){
            Log.i("---show", "onReceive: ");
            Bundle bundle = intent.getExtras();
            Message message = Message.obtain();
            message.what=200;
            String name = bundle.getString("name");
            message.obj = name;
            MainActivity.handler.sendMessage(message);
        }
    }

静态注册:

public void broad(View view) {
        Intent intent1 = new Intent();
        intent1.setAction("com.bw.wpc");
        Bundle bundle = new Bundle();
        bundle.putString("name","牛马");
        bundle.putInt("age",21);
        bundle.putFloat("money",33.2f);
        intent1.putExtras(bundle);
        sendBroadcast(intent1);
    }
@Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("com.bw.wpc")){
            Bundle extras = intent.getExtras();
            String name = extras.getString("name");
            int age = extras.getInt("age");
            float money = extras.getFloat("money");
            Toast.makeText(context,"接受到了,静态广播"+name+age+money,Toast.LENGTH_SHORT).show();
        }
    }
<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.bw.wpc"></action>
            </intent-filter>
        </receiver>             //清单文件

### 创建使用 Android 广播接收者 #### 动态注册广播接收者 为了实现动态注册的广播接收器,在 Java 中可以定义一个继承自 `BroadcastReceiver` 的类,并重写其 `onReceive` 方法。当接收到特定类型的广播时,该方法会被调用并处理传入的数据。 ```java public class BroadcastReceiveForJava extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("Receiver", "这是使用动态的方法来创建的广播接受者1)----》" + intent.getStringExtra("msg")); Toast.makeText(context, "这是使用动态的方法来创建的广播接受者1收到消息", Toast.LENGTH_SHORT).show(); abortBroadcast(); } } ``` 此代码片段展示了如何通过编程方式设置广播监听逻辑[^1]。 #### XML配置静态广播接收者 对于希望在整个应用程序生命周期内保持有效的广播接收器,则可以在应用清单文件 (`AndroidManifest.xml`) 中声明它们: ```xml <receiver android:name=".ScreenReceiver" android:enabled="true" android:exported="true"> </receiver> ``` 上述XML片断说明了怎样利用 `<receiver>` 标签指定要使用的广播接收组件及其属性[^3]。 #### 使用服务启动广播接收者 有时可能需要在一个后台进程中激活广播接收功能;此时可以通过定义一个带有适当权限的服务来进行操作: ```xml <service android:name=".RegisterService" android:enabled="true" android:exported="true"></service> <receiver android:name=".ScreenReceiver" android:enabled="true" android:exported="true"></receiver> ``` 这里展示了一个例子,其中包含了用于管理广播订阅状态的服务以及实际负责响应事件的通知处理器。 #### 时间变化触发广播接收者实例 下面是一个具体的案例——每当设备上的时间发生更改时就会触发相应的动作: ```java public class TimeChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i("TAG", "onReceive() " + "时间改变"); } } ``` 这段源码实现了针对系统级的时间调整通知作出反应的功能[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值