广播基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了广播基础相关的知识,希望对你有一定的参考价值。

1.什么是广播

       在andorid系统中,有一个类似于广播电台的功能,可以把一个公共的事件作为一个广播消息,发送给其它应用程序,只要其它应用指定了该接收的事件名称,就可以接收到这个事件消息。

       由此可以推断出,如果想要使用广播,就要有发送和接收两部分完成

       常见的广播事件有:外拨电话、接收到的短信、开机启动完成、SD卡的插拔、软件的安装、卸载、升级、电量的变化等等,当应用程序通过广播接收到这些事件后,就可以根据不同的事件做出不同的事情

2.广播的作用

       广播接收者是android四大组件之一,可以将一个事件作为一个广播消息,发送或通知给其它应用程序,当其他应用程序接收到这个信息后,就可以根据这个事件来进行其它相应的操作,类似于事件的监听

2.2.1 注册一般的广播接收者

  a:广播发送者

public class MainActivity extends Activity {//1.Activity为广播发送者
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //点击事件,按钮为:发送广播
        Button main_bt = (Button) findViewById(R.id.main_bt);
        main_bt.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();//通过意图携带广播信息
                intent.setAction("com.cm.ccm.Receive_1.send");//设置(广播事件的名称)action,接受者要在intent-filter中配置相应的action才能接收到广播
                intent.putExtra("key", "广播体操现在开始...");//设置传递的数据使用putExtra()方法,该方法类似Map集合,以键值对的方式存储数

          sendBroadcast(intent,"com.cm.ccms");//发送广播,可以带权限也可以不带权限
            }
        });
    }
}

  b:广播接受者:

public class Receive_1 extends BroadcastReceiver {//1.定义一个类继承BroadcastReceiver
    @Override                                      //2.在manifest中配置意图过滤器,ps:见下一段代码
    public void onReceive(Context arg0, Intent arg1) { //并重写onReceiver()方法,当接收到广播后,系统会调用这个方法
        String info = arg1.getStringExtra("key");//获取广播中意图携带的信息
        System.out.println(info);
        System.out.println("马上开始");
    }
}

  c:广播接受者在manifest中添加receiver节点:允许当前应用程序接收到其它应用程序发送的动作或数据的广播

1 <receiver 
2        android:name="com.cm.ccm.Receive_1">
3        <intent-filter>
4             <action android:name="com.cm.ccm.Receive_1.send" />
5        </intent-filter>
6 </receiver>

  d:权限配置

<uses-permission android:name="com.cm.ccms" />
<permission android:name="com.cm.ccms" android:protectionLevel="normal"></permission>

3.有序广播&广播拦截

3.1什么是有序广播

         当广播发送后,广播会按照接收者的优先级,逐级的发送广播

  a:广播发送者

 1 public class MainActivity extends Activity {
 2     //发送有序广播        
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         Intent intent = new Intent();
 8         //设置action过滤
 9         intent.setAction("com.cm.ccm.sendmashroom");
10         //发送有序广播
11         sendOrderedBroadcast(intent, null, new MyReceiver(), null, 1, "发蘑菇喽", null);
12     }    
13 }

  b:广播接收者之一(New MyReceiver() 是最后一个接收到广播的人,而且一定能接收到(间谍式))

1 public class MyReceiver extends BroadcastReceiver {
2 
3     @Override
4     public void onReceive(Context context, Intent intent) {
5         String result = getResultData();//该方法获取到上层传来的广播
6         System.out.println("蘑菇,你好"+result);
7     }
8 }

  c:其他级别的广播接收者

1 public class MyReceiver1 extends BroadcastReceiver {
2     @Override
3     public void onReceive(Context context, Intent intent) {
4         String resultData = getResultData();
5         System.out.println(resultData+"收到10斤蘑菇");
6         setResultData("只发两斤蘑菇");//高优先级可以更改广播内容
7         abortBroadcast();//高优先级可以中断广播
8     }
9 }

  d:manifest文件中优先级的设置:接收者将会按优先级的大小接收广播,值越大,优先级越高, 开发文档中的规范最大值为1000,最小的为-1000,但实际上最大值可以写int类型的最大值2147483647

1 <receiver
2       android:name="com.cm.ccm.MyReceiver1" >
3       <intent-filter android:priority="1000">
4           <action android:name="com.cm.ccm.sendmashroom" />
5       </intent-filter>
6 </receiver>

4.在代码中注册广播接收者(动态发送接受广播:代码中注册)

  适用范围:有些操作比较频繁,那么如果使用在清单文件中注册广播接收者是接收不到的,例如频繁的锁屏解屏,所以就必须在代码中注册广播接收者

  a:广播发送者

 1 public class MainActivity extends Activity {
 2     //广播接受者
 3     MyReceiver receiver;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8        //创建广播接受者对象
 9         receiver = new MyReceiver();
10         //创建意图过滤器对象
11         IntentFilter filter = new IntentFilter();
12         //通过意图过滤器添加事件名称
13         filter.addAction("android.intent.action.SCREEN_ON");
14         filter.addAction("android.intent.action.SCREEN_OFF");
15         //注册广播接受者
16         registerReceiver(receiver, filter);
17     }
18     @Override
19     protected void onDestroy() {//动态注册的广播一定记得在应用退出时,注销广播,否则会造成内存泄露;
20         unregisterReceiver(receiver);
21         super.onDestroy();
22     }
23 }

  b:广播接收者:不需要再manifest中配置

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();//获取广播发送者中intent-filter对象所添加的事件
        System.out.println("hellow"+action);
    }

 

 

以上是关于广播基础的主要内容,如果未能解决你的问题,请参考以下文章

从广播接收器更新片段中的列表视图

如何使用警报管理器将数据从片段传递到广播接收器

java [Intent] Intent片段以启动Activity,Service或发送广播。 #android_snippet #android

Android - 在动态注册的广播接收器上出现“无法传递广播”错误

安卓广播gps开启更新位置

[vscode]--HTML代码片段(基础版,reactvuejquery)