Android-广播接收器的使用案例

作者: 见哥哥长高了 | 来源:发表于2019-07-30 19:05 被阅读7次

广播接收器可以自由的对自己感兴趣的广播进行注册,当检测到有对应的广播发出的时候能够接收广播,并作出相应的处理。
注册广播的方式有两种,在代码中注册和在androidMainfest.xml中注册,前者是动态注册,后者是静态注册。
创建广播接收器也非常简单,我们只需要创建一个类继承自BroadCastReceiver并实现onReceive()方法即可。 当广播到来的时候,onReceive()就会执行,具体的处理逻辑代码写在这个方法中就可以了。
下面我们举几个具体用法。

动态注册注册监听网络变化

有一点需要提示的是:android系统为了保护用户设备的安全和隐私,有一些严格的规定:如果程序需要进行一些对用户来说非常敏感的操作,必须在配置文件中声明权限才可以,否则程序不能正常运行。而android中监听网络的变化,就需要添加权限配置

<uses-permission-sdk-23 android:name="android.permission.ACCESS_NETWORK_STATE"/>

类MainActivity中的实现代码如下:

public class MainActivity extends AppCompatActivity {
    
    private NetworkChangeReceiver networkChangeReceiver;

    private IntentFilter intentFilter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        intentFilter = new IntentFilter();

        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

        networkChangeReceiver = new NetworkChangeReceiver();

        registerReceiver(networkChangeReceiver,intentFilter);

    }

    @Override
    protected void onDestroy() {

        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);

    }

    class NetworkChangeReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {


            ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

            if (networkInfo != null || networkInfo.isAvailable()){

                Toast.makeText(MainActivity.this,"network isAvailable",0).show();

            }else {

                Toast.makeText(MainActivity.this,"network is not available",0).show();

            }
        }
    }
}

静态注册实现开机监听

动态注册的广播接收器可以自由的注册与注销,再灵活性方面有很大的优势,但是他也存在着缺点:必须在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有办法让程序在没有启动的情况下可以接收到广播呢?这就需要使用静态注册的方式。我们让程序接收一条开机广播。当接收到开机广播之后在 onCreate()方法中执行对应操作(简单提示)
我们创建一个类BootCompleteBroadCastReceiver继承自BroadcastReceiver,并实现onReceive()方法。
有两个属性需要也别注意一下:Exported属性表示是否允许这个广播接收器接收本程序以外的广播,Enabled表示是否启用这个广播接收器。


public class BootCompleteBroadCastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"开机完成广播",0).show();
    }
}

另外,还需要做权限处理

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

其中AndroidMainfest.xml中中的代码如下:

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

    <uses-permission-sdk-23 android:name="android.permission.ACCESS_NETWORK_STATE" />

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <receiver
            android:name=".BootCompleteBroadCastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
    </application>

由于Android启动完成后会发送一条值为android.intent.action.BOOT_COMPLETED的广播,因此我们在<intent-filter>中添加了相应的action。
完成以上工作,运行程序,我们可以重新启动手机,开机完成的时候就能看到Toast的提示信息了,在这里我们只是做了一个简单的提示操作,并无复杂逻辑。

发送自定义广播

发送标准广播

在发送广播之前,我们需要先定一个广播接收器MyBroadCastReceiver来接收广播,收到广播后给出一个提示。


public class MyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"收到了来自myBroadCastReceiver的广播",0).show();

    }
}

然后在androidManifest.xml文件中对广播接收器做如下设置:

        <receiver
            android:name=".MyBroadCastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.My_BroadCast_Test" />
            </intent-filter>
        </receiver>

我们让MyBroadCastReceiver接收一条值为android.intent.action.My_BroadCast_Test的广播,而发送的广播的值也是需要和接收的值对应的。
我们以一个按钮的点击事件post_broadcast()来触发广播的发出.

    public void post_broadcast(View view){

        Intent intent = new Intent("android.intent.action.My_BroadCast_Test");

        sendBroadcast(intent);

    }

因为广播是使用Intent进行传递,我们也可以携带一些参数,传递给广播接收器。

发送有序广播

我们知道,一个应用程序不仅可以接受到本程序内部的广播,也可以接受到别的程序所发出的广播。为了验证这一点我们再新建一个OtherMyBroadCastReceiver类并实现onReceive()方法


public class OtherMyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context,"OtherMyBroadCastReceiver收到了来自MainActivity的广播",0).show();

        throw new UnsupportedOperationException("Not yet implemented");
    }
}

我们在MainActivity中通过一个按钮点击发送一个值为android.intent.action.My_BroadCast_Test的广播,同时在androidManifest.xml中作设置:

        <receiver
            android:name=".MyBroadCastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.My_BroadCast_Test" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".OtherMyBroadCastReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

在以上的代码中我们通过android:priority属性给广播接收器设置了优先级,可以保证其先于OtherMyBroadCastReceiver接收到广播消息。MyBroadCastReceiver接收到了广播消息之后,是可以对广播进行中断的操作的。其具体实现为:在onReceive()方法中调用abortBroadcast()方法。代码取下:

public class MyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"收到了来自myBroadCastReceiver的广播",0).show();
    abortBroadcast();
    }
}

使用本地广播

前面介绍的广播全部属于系统全局广播,我们发送的广播可以被本程序之外的程序接受,也能接受来自别的程序的广播,这样以来肯定会带来一定的安全隐患。
为了解决以上安全性问题,Android引入了本地广播机制,使用这种机制发出的广播不能被本程序之外的程序所接受,当然本程序也自然不能接受到其他程序发出的广播。
用法非常简单,主要分一下几个简单的步骤:
首先通过LocalBroadcastManager的getInstance()方法得到一个实例
然后调用LocalBroadcastManager的registerReceiver()注册本地广播监听
紧接着调用LocalBroadcastManager的sendBroadcast()方法发送广播。
代码如下:

public class MainActivity extends AppCompatActivity {


    private IntentFilter intentFilter;

    private LocalReceiver localReceiver;

    private LocalBroadcastManager manager;

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

        manager = LocalBroadcastManager.getInstance(this);

        intentFilter = new IntentFilter();

        intentFilter.addAction("android.intent.action.Local_BroadCast");

        localReceiver = new LocalReceiver();

        //注册本地广播监听器
        manager.registerReceiver(localReceiver,intentFilter);

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();

        //页面销毁的时候取消广播监听
        manager.unregisterReceiver(localReceiver);

    }

    class LocalReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(MainActivity.this,"receivered local broadcast",0).show();
        }

    }


    public void post_broadcast(View view){

        Intent intent = new Intent("android.intent.action.Local_BroadCast");

        // 发送本地广播
        manager.sendBroadcast(intent);

    }
}

使用本地广播主要有很多优势的,例如:
1、可以明确的知道正在发送的广播不会离开我们的程序,不必担心机密数据泄漏的问题
2、其他的程序无法将广播发送到我们的程序内部,不必担心有安全泄漏的隐患
3、发送本地广播比发送系统广播将会更加高效

相关文章

  • Android-广播接收器的使用案例

    广播接收器可以自由的对自己感兴趣的广播进行注册,当检测到有对应的广播发出的时候能够接收广播,并作出相应的处理。注册...

  • Android 8.0之后 取消大部分静态注册广播(动态注册可以

    Andorid 8.0 对广播的使用做了变更。 当广播接收器使用静态注册方式使用时,除了一些例外,这个接收器接收不...

  • 运用EventBus

    1.可以使用BroadcastReceiver 说说思路,通过新建广播接收器,动态注册广播接收器,由登录按钮点击发...

  • 学习 | Android开发之详解广播机制

    案例最后效果: 广播的类型: 标准广播 标准广播是完全异步的广播, 也就是当广播发出之后, 所有的广播接收器机会都...

  • Android广播接收器(二)

    上一篇Android广播接收器(一)讲了使用动态注册和静态静注册广播接收器的方法来接收系统发出的广播。这篇要讲的是...

  • BroadCastReceiver

    1.广播接收器会自动调用 onReceive 方法2.广播接收器运行在UI线程(主线程) 使用方式 静态注册在我们...

  • Android基础 - BroadcastReceiver

    目录 什么是广播 如何使用广播 注册广播的方式 广播的类型 不同注册方式的广播接收器回调 不同Android AP...

  • Android使用命令adb shell am broadcas

    Android中使用命令 adb shell am broadcast 发送广播。 代码: 注册一个广播接收器,用...

  • 关于Broadcast

    前言 广播分类 标准广播:异步收发,所有的广播接收器几乎可以同时收到广播。有序广播:同步收发,当上一个广播接收器处...

  • Android广播接收器(三)

    本地广播 前面两篇文章Android广播接收器(一)和Android广播接收器(二)讲的都属于全局广播,即发出的广...

网友评论

    本文标题:Android-广播接收器的使用案例

    本文链接:https://www.haomeiwen.com/subject/ayivrctx.html