Android开发-静态广播(包含broadcast向activity中传值),动态广播(有序/无序)使用介绍

 简介:

1.按照发送方式分为两类:

(1)标准广播/无序广播

采用异步方式传播,广播发出后,所有的广播接收者几乎是同一时间收到消息的。接收没有先后顺序可言,不可以被拦截。

(2)有序广播

同步执行的广播,在广播发出后,同一时刻只有一个广播接收器可以收到消息,有优先级之分,当广播中的逻辑执行完成后,广播才会继续传播。


2按照注册的方式分类

(1)动态注册广播

在代码中注册的,推荐。

(2)静态注册广播

动态注册要求程序必须在运行时才能进行,有一定的局限性,如果我们需要在程序还没启动的时候就可以接收到注册的广播,就需要静态注册了。主要是在AndroidManifest中进行注册。


3.按照定义的方式分类

(1)系统广播

Android系统中内置了多个系统广播,每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,由系统自动发出。

(2)自定义广播

由应用程序开发者自己定义的广播


Android开发中作用:

(1)当我们需要接收系统发出或者别的程序发出来的消息的时候,就需要用到广播接收器。

(2)我们需要在应用之中传递一些数据时,我们也可以用本地广播来发送和接收这些消息。

(3)可以通过广播给不同的界面发送更新信息,对界面进行刷新。当然也可以用观察者设计模式进行操作(详见:Android开发-通过观察者设计模式刷新和关闭界面)。事实上,从实现原理看,Android中的广播就是使用了观察者模式,基于消息的发布/订阅事件模型。


静态注册举例:

步骤一:在清单文件AndroidManifest.xml注册

           android:name="com.huwan.broadcastjingtaidemo.MyBroadcastReceiver"

            android:enabled="true"

           android:exported="true">

           

                


步骤二:写一个MyBroadcastReceiver.java接收器

packagecom.huwan.broadcastjingtaidemo;


importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.widget.Toast;

importjava.io.IOException;

// 实现一个广播接收器

publicclass MyBroadcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context,Intent intent) {

        Toast.makeText(context, "receivedin MyBroadcastReceiver", Toast.LENGTH_SHORT).show();

    }

}

步骤三:MainActivity.java主界面

packagecom.huwan.broadcastjingtaidemo;


importandroid.app.Activity;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.IntentFilter;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.TextView;

importandroid.widget.Toast;


publicclass MainActivity extends Activity {

    Button btn;

    TextView tv;


    @Override

    protected void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        btn = findViewById(R.id.btn);

        tv = findViewById(R.id.tv);

    }

}


静态广播Demo样例下载:

http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastJingtaiDemo.rar



静态注册传值给activity举例:

(数据传递的方式有很多种,例如bundle,handler,intent,重新发一个广播,第三方eventbus等各种形式;我倾向于使用接口回调来写,但是写了五个小时始终报空指针,内心崩溃,最后使用观察者设计模式,本质其实还是接口回调,但是不知道为什么接口回调我没写成功,如果有朋友写出了比较简单的代码,欢迎和我沟通,谢谢)

步骤一:导入观察者封装好的三个java文件,下面可以下载的demo中有。

步骤二:在清单文件AndroidManifest.xml注册

           android:name="com.huwan.broadcastjingtaidemo.MyBroadcastReceiver"

            android:enabled="true"

           android:exported="true">

           

                


步骤二:写一个MyBroadcastReceiver.java接收器

packagecom.huwan.broadcastjingtaidemo;


importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.widget.Toast;

importjava.io.IOException;

// 实现一个广播接收器

publicclass MyBroadcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context,Intent intent) {

        Toast.makeText(context, "receivedin MyBroadcastReceiver", Toast.LENGTH_SHORT).show();

ObserverManager.getInstance().notifyObserver("观察者请刷新信息");

    }

}

步骤三:MainActivity.java主界面

packagecom.huwan.broadcastjingtaidemo;


importandroid.app.Activity;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.IntentFilter;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.TextView;

importandroid.widget.Toast;


publicclass MainActivity extends Activity {

    Button btn;

    TextView tv;


    @Override

    protected void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        btn = findViewById(R.id.btn);

        tv = findViewById(R.id.tv);

                   ObserverManager.getInstance().add(this);//注册

}


@Override

    public voidobserverUpData(String content) {

        tv.setText(content);

    }


 //销毁非常非常重要,一定不要忘记了

 @Override

protected void onDestroy() {

      super.onDestroy();

      ObserverManager.getInstance().remove(this);

  }

}

静态广播注册传值Demo样例下载:

http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastJingtaiChuanzhiDemo.rar

参考阅读:Android开发-通过观察者设计模式刷新数据或者关闭界面

参考样例:手机网络切换,通过接口回调通知主界面

Demo下载:

http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastWithNetWorkState.rar



动态广播:(无序)

packagecom.huwan.broadcastdynamicdemo1;


importandroid.app.Activity;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.IntentFilter;

importandroid.icu.text.SimpleDateFormat;

importandroid.os.Build;

importandroid.os.Bundle;

importandroid.support.annotation.RequiresApi;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.TextView;

importjava.util.Date;


publicclass MainActivity extends Activity {

    Button btn;

    TextView tv;

MyReceiver receiver;               

@Override

    protected void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        //1.注册广播

        receiver = new MyReceiver();

        IntentFilter filter=new IntentFilter();

       filter.addAction("com.huwan.broadcast.send");

       MainActivity.this.registerReceiver(receiver,filter);


        btn = findViewById(R.id.btn);

        tv = findViewById(R.id.tv);

        // 2.点击按钮,发送一个无序的广播

        btn.setOnClickListener(newView.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent();

               intent.setAction("com.huwan.broadcast.send");

                sendBroadcast(intent);

            }

        });

    }


    //3.自定义一个广播接收器

    public class MyReceiver extendsBroadcastReceiver {

        @Override

        public void onReceive(Context context,Intent intent) {

            tv.setText("收到一个无序广播----"+ new Date());

        }

}


  //4.界面关闭的时候注销广播

    @Override

    protected void onDestroy() {

        unregisterReceiver(receiver);

        super.onDestroy();

    }


}


// 举例是在主MainActivity中,要发送广播的时候,直接把发送广播的代码写到其他acitivity中即可。

Intentintent = new Intent();

intent.setAction("com.huwan.broadcast.send");

sendBroadcast(intent);

上面三行代码是发送广播的代码,处理接收广播的代码,既可以静态也可以动态。上面都有,就不写demo了。



动态广播:(有序)

步骤一:配置清单文件AndroidManifest.xml


    package="com.huwan.broadcastdynamicdemo2">


        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">

       

           

               


               



       

           

               



       

           

               



       

           

               



       

           

               




步骤二:主界面MainActivity.java写一个发送有序广播

packagecom.huwan.broadcastdynamicdemo2;


importandroid.app.Activity;

importandroid.content.Intent;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;


publicclass MainActivity extends Activity {

    @Override

    protected void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button btn = findViewById(R.id.btn);

        btn.setOnClickListener(newView.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent();

                intent.setAction("com.huwan.broadcast.kaihui");

                //有序广播,可被拦截,可终止,可以修改数据。

                sendOrderedBroadcast(intent,null, new Level4Receiver(), null, 0, "早上十点开会", null);

            }

        });

    }

}

步骤三:写优先级不同的界面分别接收到消息

Level1Receiver.java

packagecom.huwan.broadcastdynamicdemo2;


importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;


publicclass Level1Receiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context,Intent intent) {

        String message = getResultData();

        System.out.println("系主任得到的消息:"+ message);

        setResultData("早上九点开会");

    }

}

------------------------------------------------------------

Level2Receiver.java

packagecom.huwan.broadcastdynamicdemo2;


importandroid.app.AlertDialog;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

publicclass Level2Receiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context,Intent intent) {

        String message = getResultData();

        System.out.println("班主任得到的消息:"+message);

        setResultData("早上八点开会!");

    }

}

------------------------------------------------------------

Level3Receiver.java

packagecom.huwan.broadcastdynamicdemo2;


importandroid.app.AlertDialog;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;


publicclass Level3Receiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context,Intent intent) {

        String message = getResultData();

        System.out.println("班长得到的消息:"+message);

        abortBroadcast(); //无序广播需要终止(重要)

        setResultData("早上七点开会");

    }

}

------------------------------------------------------------

Level4Receiver.java

packagecom.huwan.broadcastdynamicdemo2;


importandroid.app.AlertDialog;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

publicclass Level4Receiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context,Intent intent) {

        String message = getResultData();

        System.out.println("学生得到的的消息:"+ message);

        newAlertDialog.Builder(context).setTitle("消息")

                .setMessage("学生得到的的消息:"+message)

                .setPositiveButton("知道了", null).setCancelable(true).show();

    }

}

动态无序广播Demo样例下载:

http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastDynamicdemo2.rar


更多内容请访问:www.huwan.xin


��C�6�����7d�

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容