广播接收者
一.动态注册广播
STEP 1 创建MyBroadcastReceiver类继承BroadcastReceiver
在注册广播前先要创建广播接收者,在其onReceive()方法中添加逻辑,注意此方法不应添加过多的逻辑和执行耗时的操作,且此方法不支持开启线程。
public class MyBroadcastReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Receive",Toast.LENGTH_SHORT).show();
}
}
STEP 2 在MainActivity中动态注册广播
在活动中,onCreate()方法里注册广播,点击事件发送广播,onDestory()方法里注销广播。
public class MainActivity extends Activity {
private MyBroadcastReceive receive;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button button = (Button) findViewById(R.id.button);
receive = new MyBroadcastReceive(); //实例化广播接收者
IntentFilter filter = new IntentFilter();
filter.addAction(".LOCAL_BROADCAST"); //添加匹配规则;发送广播时需要对应此匹配规则
registerReceiver(receive,filter); //注册广播
}
public void click(View v){
Intent intent = new Intent(".LOCAL_BROADCAST"); //Intent内添加匹配规则
sendBroadcast(intent); //发送(标准)广播
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receive); //注销广播;
}
}
这样,当我们点击Button时,就会发送一条广播,在MyBroadcastReceiver中的onReceive()方法中会接收到广播,并执行逻辑。
动态注册广播让开发者可以自由地控制注册与注销,比较灵活,但是必须在程序启动之后才能接收到广播。如果想让程序不启动也能接受到广播的话,就必须使用静态注册了。
二.静态注册广播
STEP 1 创建MyBroadcastReceiver类继承BroadcastReceiver
这点同动态注册一样。代码就不贴出来了。
STEP 2###在清单文件中注册
<receiver android:name=".MyBroadcastReceive">
<intent-filter>
<action android:name=".LOCAL_BROADCAST"/>
</intent-filter>
</receiver>
STEP 3 发送标准广播
public void click(View v){
Intent intent = new Intent(".LOCAL_BROADCAST"); //Intent内添加匹配规则
sendBroadcast(intent); //发送(标准)广播
}
三.发送顺序广播
STEP 1 添加优先级
只需在内添加priority属性即可。
<receiver android:name=".MyBroadcastReceive">
<intent-filter android:priority="100">
<action android:name=".LOCAL_BROADCAST"/>
</intent-filter>
</receiver>
STEP 2 发送有序广播
使用sendOrderedBroadcast()发送有序广播。第二个参数为与权限相关的字符串,这里我们填null;
Intent intent = new Intent(".LOCAL_BROADCAST"); //Intent内添加匹配规则
sendOrderedBroadcast(intent,null); //发送(有序)广播
优先级高的接收者可以对广播进行拦截,在onReceive()方法中使用abortBroadcast()即可。
四.发送本地广播
一、二、三所实现的均为全局广播,即发出的广播可以被其他任何应用程序收到,我们也可以接受其他应用程序发出的广播,对安全性造成了很大的影响。所以我们用本地广播实现只在本应用程序内发送和接收广播。
实现本地广播需要用LocalBroadcastManager.getInstance(this)方法获取到LocalBroadcastManage的实例,因为注册本地广播、发送本地广播、注销本地广播都需要借助它来实现。
public class MainActivity extends Activity {
private MyBroadcastReceive receive;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button button = (Button) findViewById(R.id.button);
receive = new MyBroadcastReceive(); //实例化广播接收者
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取本地广播管理者的实例
IntentFilter filter = new IntentFilter();
filter.addAction(".LOCAL_BROADCAST"); //添加匹配规则;发送广播时需要对应此匹配规则
localBroadcastManager.registerReceiver(receive,filter); //使用本地广播管理者注册广播
}
public void click(View v){
Intent intent = new Intent(".LOCAL_BROADCAST"); //Intent内添加匹配规则
localBroadcastManager.sendBroadcast(intent); //发送(本地)广播
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(receive); //注销广播;
}
}