zoukankan      html  css  js  c++  java
  • Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)

    之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播

    1. 我们首先了解一下有序广播和无序广播区别和联系

    (1)有序广播
    > 接受者有优先级,接受按照先后顺序接受,类似中央向下传文件。高优先级的接受者可以把广播消息给拦截,还可以修改广播的数据
    (2)无序广播
    > 接受者没有优先级,没有先后顺序。类似听广播,看新闻联播不可以被拦截
    > sendBroadcast(intent)

    (3)有序广播和无序广播没有什么本质的区别,
    相同点:
               无序广播也是按照先后顺序接受
    不同点:
               无序广播如果拦截,会拦截失败
    不可以修改数据。

    2. 类似Android(java)学习笔记178我们再次新建 自定义广播程序 广播接收者程序如下:

    (1)首先我们 自定义广播如下:

    ->1:这里的布局文件activity_main.xml如下:

    <RelativeLayout 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"
        tools:context=".MainActivity" >
    
        <Button
            android:onClick="click"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="向下发红头文件" />
    
    </RelativeLayout>

    其效果图如下:

    ->2:下面是 MainActivity.java 和 FinalReceiver.java 的代码内容:

    MainActivity.java:

    package com.itheima.xidada;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View view){
            Intent intent = new Intent();
            intent.setAction("com.itheima.xidada.GZSN");//关注三农
            //发送有序的广播
            //sendOrderedBroadcast(intent, null, new FinalReceiver(), null, 1, "给每个农民兄弟发10000快钱", null);
            sendBroadcast(intent);
        }
    
    }

    FinalReceiver.java:

    package com.itheima.xidada;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class FinalReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("我是巡查员:"+getResultData());
    
        }
    
    }

    (2)广播接收者程序工程:

    ->1:这里的ShengReceiver、ShiReceiver、XiangReceiver、NongminReceiver分别对应于省级,市级,乡级,以及农民的广播接收者,也就是买录音机

    但是他们优先级不一样(有序广播),分别是:省级 > 市级 > 乡级 > 农民,这里在AndroidManifest.xml中进行配置,如下:

    android:priority 值越大优先级越大

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itheima.govpeople"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.itheima.govpeople.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <receiver android:name="com.itheima.govpeople.ShengReceiver" >
                <intent-filter android:priority="1000">
                    <action android:name="com.itheima.xidada.GZSN" />
                </intent-filter>
            </receiver>
            <receiver android:name="com.itheima.govpeople.ShiReceiver" >
                <intent-filter android:priority="600">
                    <action android:name="com.itheima.xidada.GZSN" />
                </intent-filter>
            </receiver>
            <receiver android:name="com.itheima.govpeople.XiangReceiver" >
                <intent-filter android:priority="200">
                    <action android:name="com.itheima.xidada.GZSN" />
                </intent-filter>
            </receiver>
            <receiver android:name="com.itheima.govpeople.NongminReceiver" >
                <intent-filter android:priority="-1000">
                    <action android:name="com.itheima.xidada.GZSN" />
                </intent-filter>
            </receiver>

    </application> </manifest>

    ->2:这里各个广播接收者的代码如下:

    ShengReceiver.java:

    package com.itheima.govpeople;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class ShengReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("我是省级部门,"+getResultData());
            //终止广播事件
            //abortBroadcast();
            setResultData("给每个农民兄弟发5000");
        }
    
    }

    ShiReceiver.java:

    package com.itheima.govpeople;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class ShiReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("我是市级部门,"+getResultData());
            setResultData("给每个农民兄弟发2000");
        }
    
    }

    XiangReceiver.java:

    package com.itheima.govpeople;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class XiangReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("我是乡级部门,"+getResultData());
            setResultData("给每个农民兄弟发一袋大米和一壶油");
        }
    
    }

    NongminReceiver.java:

    package com.itheima.govpeople;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class NongminReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("我是农民,"+getResultData() );
            System.out.println("感谢党,感谢政府。");
        }
    
    }

    在上面ShengReceiver.java:代码中如果启用:

    abortBroadcast();
    我们会发现如下:高优先级(相对的,下面的市级/乡级同样可以终止广播)的广播接收者可以终止广播,效果就如下一样,终止


    这里我们不终止广播,修改广播的数据,一级一级修改数据:代码就是上面的所示,下面是程序的运行的效果图:
    下面我们用两张 修改数据没有修改数据 的图进行对比:


    没有修改数据




    修改数据


  • 相关阅读:
    使用NBU进行oracle异机恢复
    mycat偶尔会出现JVM报错double free or corruption并崩溃退出
    exp导出数据时丢表
    service_names配置不正确,导致dg创建失败
    XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
    HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
    java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
    【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版
    java内部类深入详解 内部类的分类 特点 定义方式 使用
    再谈包访问权限 子类为何不能使用父类protected方法
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4742714.html
Copyright © 2011-2022 走看看