Android Broadcas 广播

来源:互联网 发布:python可视化界面设计 编辑:程序博客网 时间:2024/06/05 21:07

一、广播简介

1.Android四大组件之一

2. 一种全局的监听器,用于监听系统全局的广播消息

3. 系统大部分消息都以广播的形式发布,比如开机启动完成的消息,收到短信的消息,打进打出电话的消息。

ex:

android系统每次启动完成会向外广播一条信息,告诉所有人启动完成了,只有继承自Broadcast 的类能捕捉到这些系统信息,捕捉到信息该干嘛就干嘛


二、广播实现(自定义广播接收者和发送者)


三、广播的分类

一般广播的发送者会分为   无序广播  和  有序广播

而接收者一般分为    静态接收者  和  动态接收者


无序广播的发送代码:

//发送广播         //两种类型广播   有序广播   无序广播         Intent intent=new Intent();         //指定广播的名字         intent.setAction("com.example.myas_send.Hug");         //指定广播内容         intent.putExtra("content",content);         //发送无序广播         sendBroadcast(intent);


而无序广播的还有一个特殊的种类,叫做“无序黏性广播

    <span style="white-space:pre">  </span>//发送无序黏性广播       <span style="white-space:pre"> </span>sendStickyBroadcast(intent);  

有序广播的区别也只是在于一句发送代码的不同

<span style="white-space: pre;">    </span>//发送有序广播  

sendOrderedBroadcast(intent,null);  

里面的那个null 是一个指令,可以填写其他的,如果接收者每有添加指令就接收不到发送的信息



下来我们来讲接收者

先来讲解动态接收者:动态接收者主要是由Java代码编写,需要注册广播和注销广播

    package com.example.myas_jiesou_01;            import android.content.IntentFilter;      import android.support.v7.app.AppCompatActivity;      import android.os.Bundle;            public class MainActivity extends AppCompatActivity {                private IntentFilter intentFilter;          private MyReceiver01 myReceiver01;                @Override          protected void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);              setContentView(R.layout.activity_main);              myReceiver01=new MyReceiver01();              intentFilter = new IntentFilter();              intentFilter.addAction("com.example.myas_send.Hug");              <span style="color:#ff0000;">intentFilter.setPriority(998);</span>          }                @Override          protected void onResume() {              super.onResume();              //注册广播              registerReceiver(myReceiver01,intentFilter);          }                @Override          protected void onDestroy() {              super.onDestroy();              //取消注册  注销              unregisterReceiver(myReceiver01);          }      }  


上面代码中有一条红色的代码,标识出来主要是因为它只能是接收有序信息的时候用,它的作用是设置优先级,一般优先级为  -1000到1000,-1000为最低,1000为最高。


接下来是静态的接收者:静态接收者主要是在XML文件中配置,这和动态是有区别的

<?xml version="1.0" encoding="utf-8"?>  <manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.example.myas_jiesou_02">        <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>         <span style="color:#ff0000;"> <receiver android:name=".MyReceiver02">              <intent-filter android:priority="1000">                  <action android:name="com.example.myas_send.Hug"></action>              </intent-filter>          </receiver></span>      </application>    </manifest>  



java代码部分主要是用来接收广播发出的信息,下面的代码中我们还做了一个加工,是一个用来拦截垃圾信息的,比如,下面代码中是信息中带“免费”二字的会被拦截,将不会被接收

    package com.example.myas_jiesou_02;            import android.content.BroadcastReceiver;      import android.content.Context;      import android.content.Intent;      import android.os.Bundle;      import android.util.Log;            /**       * Created by Administrator on 2017/7/11 0011.       */            public class MyReceiver02 extends BroadcastReceiver {          @Override          public void onReceive(Context context, Intent intent) {             String action=intent.getAction();              if("com.example.myas_send.Hug".equals(action)){                  //获取广播内容                  String content=intent.getStringExtra("content");                  Log.i("test","广播接受者2号:"+content);                        //判断                  if(content.contains("免费")){                      //不传播                      abortBroadcast();                  }                        //改变广播的内容                  //设置结果                  Bundle bundle=new Bundle();                  bundle.putString("newContent",content+",开玩笑的,你阔以免费拥有小灰灰");                  setResultExtras(bundle);              }          }      }  


下面我们来讲讲动态接收和静态接收的区别

一、 动态接收的优先级是大于静态接收的,除非用有序发送时设置了静态接收的优先级大于动态优先级。

二、 静态接收就算关闭了它也能接收到广播发送的信息,而动态接收必须是无序黏性广播发送信息才能在离开时接收到信息。