Android学习笔记(十一)BroadcastReceiver动态注册、注销示例

  在上一篇博文中简单介绍了一下BroadcastReceiver的相关知识点,本篇举一个在代码中动态的注册、注销BroadcastReceiver的栗子。

1、首先创建一个MyReceiver并继承BroadcastReceiver,既然要动态注册该receiver的话,就无需在AndroidManifest.xml中配置它了:

 1 public class MyReceiver extends BroadcastReceiver {
 2     public static final String ACTION = "com.codingblock.receive.intent.action.MyReceiver";
 3 
 4     public MyReceiver() {
 5         
 6     }
 7 
 8     @Override
 9     public void onReceive(Context context, Intent intent) {
10         System.out.println("接收到的消息为:" + intent.getStringExtra("data"));
11     }
12 }

代码分析:上面代码中定义了一个静态变量ACTION,以方便程序指定该receiver。另外,从onReceive()方法的第二个参数intent可以获取到传递过来的数据。

2、布局文件如下,很简单,只有三个按钮:发送消息按钮、注册receiver按钮和注销receiver按钮。

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

    <Button
        android:id="@+id/btn_send_receiver"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送消息" />
    
    <Button
        android:id="@+id/btn_register_receiver"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注册receiver" />
    
    <Button
        android:id="@+id/btn_unregister_receiver"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注销receiver" />

</LinearLayout>

3、最后在MainActivity中测试一下

 1 public class MainActivity extends Activity implements OnClickListener {
 2     private MyReceiver receiver = null;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         findViewById(R.id.btn_send_receiver).setOnClickListener(this);
 8         findViewById(R.id.btn_register_receiver).setOnClickListener(this);
 9         findViewById(R.id.btn_unregister_receiver).setOnClickListener(this);
10     }
11 
12     @Override
13     public void onClick(View v) {
14         switch (v.getId()) {
15         case R.id.btn_send_receiver:
16             Intent i = new Intent(MyReceiver.ACTION);
17             i.putExtra("data", "来自MainActivity的消息");
18             sendBroadcast(i);
19             break;
20         case R.id.btn_register_receiver:
21             if (receiver == null) {
22                 System.out.println("注册receiver");
23                 receiver = new MyReceiver();
24                 registerReceiver(receiver, new IntentFilter(MyReceiver.ACTION));
25             }
26             break;
27         case R.id.btn_unregister_receiver:
28             if (receiver != null) {
29                 System.out.println("注销receiver");
30                 unregisterReceiver(receiver);
31                 receiver = null;
32             }
33             break;
34 
35         default:
36             break;
37         }
38     }
39 }

代码分析:本段代码在23行,通过registerReceiver()方法动态的注册了MyReceiver,并且使用过后最好不要忘了用unregisterReceiver()方法再将其注销,注销后应将receiver设为null。

4、运行结果如下

测试就会发现在点击发送消息按钮之前,如果没有注册receiver的话是不能成功发送消息的,只有注册了receiver,点击发送消息log中才有输出:

从日志输出就能看出,当注册好了receiver后,按下发送消息按钮,在MyReceiver中就能收到来自MainActivity的消息。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏非著名程序员

玩转EventBus,详解其使用

? 概述 EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,...

1926
来自专栏7号代码

Android应用界面开发——BroadcastReceiver(实现基于Service的音乐播放器)

BroadcastReceiver用于接收程序(开发者开发的程序和系统程序)发出的Broadcast Intent,程序启动BroadcastReceiver需...

732
来自专栏向治洪

顺序广播和无序广播

普通广播(Normal Broadcast): 一,优缺点:和有序广播的优缺点相反! 二,发送广播的方法:sendBroadcast() 有序广播(Or...

1879
来自专栏吴小龙同學

Android之BroadcastReceiver

什么是BroadcastReceiver?   BroadcastReceiver,广播接收者,它是一个系统全局的监听器,用于监听系统全局的Broadcast消...

3355
来自专栏青玉伏案

Android开发之Activity的生命周期以及加载模式

本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类...

1927
来自专栏mukekeheart的iOS之旅

Android基础总结(10)——手机多媒体的运用:通知、短信、相机、视频播放

Android提供了一系列的API,是我们可以在程序中调用很多手机的多媒体资源,从而编写出更加丰富的应用程序。 1、通知的使用 通知(Notification...

2348
来自专栏CodingBlock

Android学习笔记(九)一个例子弄清Service与Activity通信

  上一篇博文主要整理了Service的创建、绑定过程,本篇主要整理一下Service与Activity的通信方式。包括在启动一个Service时向它传递数据、...

2098
来自专栏Android常用基础

MVC、MVP、MVVM的理解与使用

对于MVC、MVP、MVVM,这都是Android开发的一种架构,随着日积月累的开发,很对人对这几种模式是再熟悉不过了。不过当初我在学习的时候是因为看一个开源项...

531
来自专栏yang0range

Activity详解(一)——典型生命周期分析

Activity的重要性,在Android的开发当中不言而喻,作为四大组件当中,使用最为频繁的组件,有必要对它进行一个全方面的了解和认识,下面我们通过一系列的文...

902
来自专栏郭耀华‘s Blog

浅谈android Service和BroadCastReceiver

1.题记        Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发...

2657

扫码关注云+社区