前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 全局广播的使用

Android 全局广播的使用

作者头像
指点
发布2019-01-18 17:33:40
1.9K0
发布2019-01-18 17:33:40
举报
文章被收录于专栏:指点的专栏指点的专栏

广播作为Android一个重要的组成部分,很多功能的实现都依赖于广播,Android系统在发生一些重要事情的时候都会发送广播(电量变化、网络变化等等)。我们也可以在自己得应用程序中发送广播信息,一些能够接受到特定的广播信息的广播接收器就能够接收到对应的广播信息。进而进行事件处理,那么首先我们来看一下广播的基本使用方法。

代码语言:javascript
复制
广播按照接收的有序性可以分为有序广播和无序广播,无序广播就是一个广播信息发送出去之后,能够接收到这个信息的广播接收器会同时接收到这条广播信息,而有序广播就是按照广播接收器的优先级高低依次接收广播信息,并且广播传送过程中在广播接收器中可以终止广播的传送。

广播接收器在使用之前必须要先注册,注册广播接收器可以采用静态注册和动态注册两种方式。静态注册:在Android配置文件androidmanifest.xml 中完成广播接收器的注册,动态注册:在java代码中通过registerReceiver方法完成注册,两者各有优缺点,静态注册无需等程序启动就能接收到这个广播接收器能够接收到的广播信息,但是没有动态注册那么灵活,而动态注册则是广播接收器直接在代码中完成注册,比较灵活,但是必须要等待程序运行并且注册了这个广播接收器之后,这个广播接收器才能接收广播信息(其实很好理解,就是要等到广播接收器完成注册之后才能接收广播信息)。

我们先来看一下无序广播,新建一个Android工程: activity.xml:

代码语言:javascript
复制
<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="horizontal"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/sendBroadcastButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送广播" />

</LinearLayout>

MainActivity.java:

代码语言:javascript
复制
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    public static String ACTION = "com.example.blogBroadcasts.MY_BROADCAST";
    private IntentFilter intentFilter = null;
    private MyBroadcastReceiver myBroadcastReceiver = null;
    private Button button = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentFilter = new IntentFilter(MainActivity.ACTION);   // 设置广播接收器的信息过滤器,
        myBroadcastReceiver = new MyBroadcastReceiver();
        // 在代码中动态注册广播接收器,intentFilter为这个广播接收器能接收到的广播信息的动作类型,用于过滤广播信息
        registerReceiver(myBroadcastReceiver, intentFilter);    

        button = (Button) findViewById(R.id.sendBroadcastButton);
        button.setOnClickListener(listener);
    }

    private View.OnClickListener listener = new View.OnClickListener() {    // 设置按钮的单击监听事件
        @Override
        public void onClick(View v) {
            switch(v.getId())
            {
            case R.id.sendBroadcastButton:
                /* 
                 * 新建一个Intent对象用来发送广播,参数为Intent执行的动作类型,
                 * 只有IntentFilter对象中包含了这个动作的广播接收器才能接收到这条广播信息,
                 * IntentFilter对象即为我们注册广播接收器时registerReceiver方法的第二个参数
                 */
                Intent intent = new Intent(MainActivity.ACTION);    
                sendBroadcast(intent);
                break;
            }

        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    class MyBroadcastReceiver extends BroadcastReceiver // 广播接收器内部类
    {
        @Override 
        public void onReceive(Context context, Intent intent)
        {
            Toast.makeText(context, "动态注册广播接收器接收到的广播信息", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        unregisterReceiver(myBroadcastReceiver);    // 注销广播接收器
    }
}
在代码中,我们定义了一个内部类MyBroadcastReceiver继承于BroadcastReceiver类并且实现了它的抽象方法onReceive,在这个方法中我们添加了接收到广播信息之后的处理,当然,这里只是简单地打印了一个信息,在onCreate方法中,我们用resgisterReceiver方法动态注册了广播接收器,并且为其添加了信息过滤器,只有信息过滤器中包含了 发送广播的Intent对象中的setAction方法中的参数时,这个广播信息才能被这个广播接收器接收到(其实就是发送广播的Intent对象的动作类型能够在注册广播时的IntentFilter对象中存在相同的动作类型时,这个广播接收器才能接收到这个Intnet对象发送的广播信息)。

运行程序:

这里写图片描述
这里写图片描述

单击“发送广播”按钮:

这里写图片描述
这里写图片描述

上面的程序我们采用了使用代码动态注册广播接收器的方法注册广播接收器,并且我们在我们自己的程序中发送广播信息,我们接着来看一下静态广播注册,假设我们要程序在系统启动完成之后,弹出“弹出系统启动完成”提示信息,实现如下: 在androidmanifest.xml配置文件中加入以下代码:

代码语言:javascript
复制
<receiver
            android:name="StaticBroadCastReceiver"
            android:exported="true"
            android:enabled="true">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
</receiver>

在这里,我们在intent-filter中加入过滤信息类型:“android.intent.action.BOOT_COMPLETED”,当系统启动完成时,Android系统会发送动作类型为“android.intent.action.BOOT_COMPLETED”的广播信息,那么,我们的程序就能够接收到这个广播信息了。 别忘了在配置文件中加入检测系统的启动信息权限,否则程序会崩溃: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <!-- 应用程序申请检测系统启动完成信息 -->

OK,广播接收器的静态注册就完成了,接下来我们新建一个类 StaticBroadcastReceiver.java:

代码语言:javascript
复制
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class StaticBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Toast.makeText(context, "系统启动完成", Toast.LENGTH_SHORT).show();
    }
}

接下来,安装程序,重启模拟器:

这里写图片描述
这里写图片描述

Good,和我们预想的一样,系统启动完成的时候,我们并没有启动程序,但是却会有提示信息,这就是静态注册广播接收器的优点,我们可以利用这一点设置程序的开机启动等功能。

上面是无序广播的一些用法,接下来我们来看一下有序广播的简单用法:修改MainActivity.java代码:

代码语言:javascript
复制
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    public static String ACTION = "com.example.blogBroadcasts.MY_BROADCAST";
    private IntentFilter intentFilter = null;
    private MyBroadcastReceiver myBroadcastReceiver = null;
    private OtherBroadcastReceiver otherBroadcastReceiver = null;
    private Button button = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentFilter = new IntentFilter(MainActivity.ACTION);   // 设置广播接收器的信息过滤器,
        intentFilter.setPriority(100);
        myBroadcastReceiver = new MyBroadcastReceiver();
        // 在代码中动态注册广播接收器,intentFilter为这个广播接收器能接收到的广播信息的动作类型,用于过滤广播信息
        registerReceiver(myBroadcastReceiver, intentFilter);

        intentFilter.setPriority(0);
        otherBroadcastReceiver = new OtherBroadcastReceiver();
        registerReceiver(otherBroadcastReceiver, intentFilter); // 注册第二个广播接收器,优先级较低

        button = (Button) findViewById(R.id.sendBroadcastButton);
        button.setOnClickListener(listener);
    }

    private View.OnClickListener listener = new View.OnClickListener() {    // 设置按钮的单击监听事件
        @Override
        public void onClick(View v) {
            switch(v.getId())
            {
            case R.id.sendBroadcastButton:
                /* 
                 * 新建一个Intent对象用来发送广播,参数为Intent执行的动作类型,
                 * 只有IntentFilter对象中包含了这个动作的广播接收器才能接收到这条广播信息,
                 * IntentFilter对象即为我们注册广播接收器时registerReceiver方法的第二个参数
                 */
                Intent intent = new Intent(MainActivity.ACTION);    
                sendOrderedBroadcast(intent, null); // 发送有序广播
                break;
            }

        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    class MyBroadcastReceiver extends BroadcastReceiver // 广播接收器内部类
    {
        @Override 
        public void onReceive(Context context, Intent intent)
        {
            Toast.makeText(context, "优先级较高的广播接收器接收到的广播信息", Toast.LENGTH_SHORT).show();
        }
    }

    class OtherBroadcastReceiver extends BroadcastReceiver  // 第二个广播接收器
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Toast.makeText(context, "优先级较低的广播接收器接收到的广播信息", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        unregisterReceiver(myBroadcastReceiver);
        unregisterReceiver(otherBroadcastReceiver); // 注销广播接收器
    }
}

我们添加了一个广播接收器的内部类,并且实现了onReceive方法,并且在注册广播接收器的时候在IntentFilter的对象中设置了优先级属性,在发送广播的时候使用了sendOrderBroadcast方法来发送有序广播,sendOrderBroadcast方法有两个参数,第一个参数为要发送的广播信息的Intent对象,第二个参数为与广播信息接收权限有关的字符串,这里传入null就行了。 运行程序,单击按钮,我们会看到两个广播接收器都接受到了广播信息,但是如果我们在第一个广播接收器的onReceive方法中加入一行代码:abortBroadcast();

这里写图片描述
这里写图片描述

那么第二个广播接收器就不能接收到广播信息了,因为,这条广播信息已经在第一个广播接收器中被abortBroadcast方法阻拦了。

Ok,关于全局广播的介绍就是这些了,其实Android还有一个本地广播,由于篇幅关系,并且本地广播比较简答,所以这里就不介绍了。若有不对之处,还请指正。 谢谢观看。。。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年01月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档