一、Android广播概念:
在Android中,有一些操作完成以后,会发送广播,Android系统内部产生这些事件后广播这些事件,至于广播接收对象是否关心这些事件,以及它们如何处理这些事件,都由广播接收对象自己决定。
二、发送全局广播:
- 发送广播有两种类型:
- 标准广播
- 有序广播
1.标准广播:
完全异步执行的广播,发出广播后,所有的广播接收器几乎会在同一时刻收到这条广播通知。
//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//第一步:将需要广播的消息封装到Intent中
Intent intent = new Intent();
intent.putExtra("name","张三");
//第二步:自定义广播频段,表示该条广播会在那个频段下发出
intent.setAction("my.broadcast.key");
//第三步:调用Context的sendBroadcast()方法将广播发送出去;
sendBroadcast(intent);
}
});
2.有序广播:
同步执行的一种广播,同一时刻只有一个广播接收器能收到,这个广播接受者的逻辑执行完后,才会传递到下一广播接受者。
//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//第一步:将需要广播的消息封装到Intent中
Intent intent = new Intent();
intent.putExtra("name","张三");
//第二步:自定义广播频段,表示该条广播会在那个频段下发出
intent.setAction("my.broadcast.key");
//第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
//第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
sendOrderedBroadcast(intent,null);
}
});
/*
1.优先接收到广播的Broadcastreceiver广播接收者可以通过setResultExtras(Bundle)方法将一个Bundle对象设置为结果集对象,传给下一个接收者。
2.下一个接收者通过getResultExtras()可以获取上一个接收者存入的数据
3.中断广播,拦截一条广播不往下发送abortBroadcast()
*/
三、接收全局广播:
为了监听这些广播事件,Android提供了一个BroadcastReceiver全局监听器组件,该组件可以监听来自系统或应用程序的广播。
1.运行机制:
当系统或其他应用程序发送广播时,所有已经注册的 BroadcastReceiver 的应用程序就会检查注册时的IntentFilter里的Action是否与发送广播时的Intent的Action相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法进行处理,所以主要工作是对BroadcastReceiver里的onReceive()方法的实现。
2.步骤:
第一步:创建一个类继承BroadcastReceiver,实现onReceive()方法
package com.example.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
//检测到广播后会自动回调onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "检测到广播", Toast.LENGTH_LONG).show();
}
}
第二步:注册BroadcastReceiver
- 动态注册:
//1.构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//2.Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//3.将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//4.注册广播接收器
registerReceiver(receiver, filter);
- 静态注册:
<!--广播接收器的全限定类名-->
<receiver android:name="com.example.myapplication.MyReceiver"
android:exported="true">
<!--过滤机制-->
<intent-filter>
<action android:name="my.broadcast.key"/>
</intent-filter>
</receiver>
3.BroadcastReceiver生命周期:
每次广播事件发生后,系统就会创建对应的BroadcastReceiver实例对象,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例对象就会被销毁。
四、本地广播:
前面接触的广播都是全局广播,这同样意味着我们APP发出的广播,其他APP都会接收到,但是部分广播我们不希望其他APP捕获。
Android中给我们提供了本地广播 LocalBroadcastManager 的机制,使用该机制发出的广播只会在APP内部传播,而且广播接收者也只能收到本应用发出的广播。
1.实现只在本应用内发送广播:
发送广播的具体步骤同(二)
第一步:获取LocalBroadcastManager的实例对象
LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;
第二步:调用LocalBroadcastManager对象的sendBroadcast()发送广播
localBroadcastManager.sendBroadcast(intent);
2.实现只接收本应用内的广播:
接收广播的具体步骤同(三)
第一步:获取LocalBroadcastManager的实例对象
LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;
第二步:通过LocalBroadcastManager对象的registerReceiver()注册广播
localBManager. registerReceiver(localReceiver, intentFilter);
五、案例:广播的接收和发送
注:其实这部分内容我也没有太深入的理解,主要是根据这个简单的案例写的文章。
MyReceiver.java:
package com.example.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "检测到广播,广播内存有数据:"+intent.getStringExtra("name"), Toast.LENGTH_LONG).show();
}
}
MainActivity.java:
package com.example.myapplication;
import android.content.IntentFilter;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = findViewById(R.id.btn);
//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//第一步:将需要广播的消息封装到Intent中
Intent intent = new Intent();
intent.putExtra("name","张三");
//第二步:自定义广播频段,表示该条广播会在那个频段下发出
intent.setAction("my.broadcast.key");
//第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
//第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
sendBroadcast(intent);
}
});
//构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//注册广播接收器
registerReceiver(receiver, filter);
}
}
效果:
点击按钮发送全局标准广播,并被本应用捕获。