一、广播简介
1. Android四大组件之一
2. 一种全局的监听器,用于监听系统全局的广播消息
3. 系统大部分消息都以广播的形式发布,比如开机启动完成的消息,收到短信的消息,打进打出电话的消息。
二、广播实现(自定义广播接收者和发送者)
三、广播的分类
一般广播的发送者会分为 无序广播 和 有序广播
而接收者一般分为 静态接收者 和 动态接收者
无序广播的发送代码:
- //发送广播
- //两种类型广播 有序广播 无序广播
- Intent intent=new Intent();
- //指定广播的名字
- intent.setAction("com.example.myas_send.Hug");
- //指定广播内容
- intent.putExtra("content",content);
- //发送无序广播
- sendBroadcast(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);
- }
- }
- }
下面我们来讲讲动态接收和静态接收的区别
一、 动态接收的优先级是大于静态接收的,除非用有序发送时设置了静态接收的优先级大于动态优先级。
二、 静态接收就算关闭了它也能接收到广播发送的信息,而动态接收必须是无序黏性广播发送信息才能在离开时接收到信息。