思维导图:
广播简介:
在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。
广播三要素:
Android广播机制包含三个基本要素:广播(Broadcast) - 用于发送广播;广播接收器(BroadcastReceiver) - 用于接收广播;意图内容(Intent)-用于保存广播相关信息的媒介。Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
举例:
广播电台与收音机之间的关系,广播电台它只负责发送消息,他不管到底有没有人收,也不管有没有收到,它只负责发送。而收音机只需要将频率调成和广播电台一个频道就可以接收到发送的消息。
无序广播
自定义一个广播发送者
写一个界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android21_sender.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入发送的广播"
android:id="@+id/editText"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送"
android:onClick="Send"
/>
</LinearLayout>
package com.example.android21_sender;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);//获取输入框控件
}
public void Send(View view){
String content=editText.getText().toString(); //获取控件里面的文本内容
//发送广播
// 两种类型广播
Intent intent=new Intent();
//指定广播的名字
intent.setAction("com.example.android21_sender.test");
//指定广播的内容
intent.putExtra("content",content);
//发送无序广播
//sendBroadcast(intent);
//发送黏性广播
sendStickyBroadcast(intent);
}
}
注意:发送黏性广播需要在AndroidManifest.xml添加权限
<!--黏性广播权限-->
<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>
广播接收者01号(动态注册01号)采取Java代码设置
核心代码:
接收者类
package com.example.android21_receiver01;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2017/7/11 0011.
*/
public class Receiver01 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的名字
String action=intent.getAction();
if("com.example.android21_sender.test".equals(action)){
//获取广播内容
String content=intent.getStringExtra("content");
Log.i("test","广播接受者1号:"+content);
}
}
}
注册,Java代码设置
package com.example.android21_receiver01;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private Receiver01 myReceiver01;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver01 = new Receiver01();
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.android21_sender.test"); //设置频道
}
@Override
protected void onResume() {
super.onResume();
//注册广播
registerReceiver(myReceiver01,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册 注销
unregisterReceiver(myReceiver01);
}
}
广播接收者02号(静态注册02号)采取XML配置方式
核心代码:
package com.example.android21_receiver02;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2017/7/11 0011.
*/
public class Receiver02 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的名字
String action=intent.getAction();
if("com.example.android21_sender.test".equals(action)){//判断是否在同一频道
//获取广播内容
String content=intent.getStringExtra("content");
Log.i("test","广播接受者2号:"+content); //打印出接收到的消息
}
}
}
注意:需要在
AndroidManifest.xml中配置receiver
<receiver android:name=".Receiver02">
<intent-filter>
<action android:name="com.example.android21_sender.test"></action>
</intent-filter>
</receiver>
总结(一):
①、如果同是静态接收者,谁先安装,谁就先收到广播发送的消息。
②、静态注册和动态注册,则动态注册的优先级高,先收到消息。
③、静态接收者无论是否运行程序都会接收消息
④、动态接收者,如果没有运行则接收不到。当发送完毕再运行接收,就收不到消息。为了解决这一个问题,就有了黏性广播。黏性广播事先接收了消息,但不进行任何操作,当你运行时才执行操作。
⑤、相同广播,谁先安装谁接收的消息越快
有序广播
广播发送者
发送界面与上面无需广播一样
核心代码:
package com.zking.administrator.g160628_android21_sender;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText et_main_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_main_content = (EditText) findViewById(R.id.et_main_content);
}
public void send(View view){
String content=et_main_content.getText().toString();
//发送广播
//两种类型广播
//有序广播 无序广播
Intent intent=new Intent();
//指定广播的名字
intent.setAction("com.example.android21_sender.test");
//指定广播内容
intent.putExtra("content",content);
//发送有序广播
sendOrderedBroadcast(intent,null);
}
}
广播接收者01号(动态注册)
核心代码:
注册类
package com.example.android21_sender;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity { private MyReceiver01 myReceiver01; private IntentFilter intentFilter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver01 = new MyReceiver01(); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.android21_sender.test");
intentFilter.setPriority(998); //设置优先级 } @Override protected void onResume() { super.onResume(); //注册广播 registerReceiver(myReceiver01,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //取消注册 注销 unregisterReceiver(myReceiver01); }}
接收类
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 MyReceiver01 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取广播的名字 String action=intent.getAction(); if("com.example.android21_sender.test".equals(action)){package com.example.android21_receiver01;
//获取结果 Bundle bundle=getResultExtras(true); String content=bundle.getString("newContent"); Log.i("test","广播接受者1号:"+content); } }}
广播接收者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.android21_sender.test".equals(action)){package com.example.android21_receiver02;
//获取广播内容 String content=intent.getStringExtra("content"); Log.i("test","广播接受者2号:"+content); //判断 if(content.contains("免费")){ //当内容中含有免费字样的时候不传播了 abortBroadcast(); //停止向下传播 } //改变广播的内容 //设置结果 Bundle bundle=new Bundle(); bundle.putString("newContent",content+",开玩笑的,你阔以免费拥有小灰灰"); setResultExtras(bundle); } }}
XML配置<receiver android:name=".MyReceiver02"><!--设置优先级-->
<intent-filter android:priority="1000" > <action android:name="com.example.android21_sender.test"></action> </intent-filter>
总结(二):①有序广播可以设置优先级,范围是(1000 ~ -1000)整数类型,数字越大优先级越高,先得到消息
②有序广播可禁止往下传播
③有序广播可以改变向下传播的内容