BroadcastReceiver
注册方式
静态注册动态注册 发送广播分类
普通广播有序广播 onReceive广播发送过程
BroadcastReceiver
广播接收者(简称广播)在安卓开发中应用广泛,使用起来也很简单。
注册方式
首先创建一个BroadcastReceiver:
package com.scott.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver {
private static final String TAG =
"MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra(
"msg");
Log.i(TAG, msg);
}
}
静态注册
<receiver android:name=".MyReceiver">
<intent-filter>
<action
android:name="android.intent.action.MY_BROADCAST"/>
<category
android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
在menifest里面注册,只要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。
动态注册
MyReceiver receiver =
new MyReceiver();
IntentFilter filter =
new IntentFilter();
filter.addAction(
"android.intent.action.MY_BROADCAST");
registerReceiver(receiver, filter);
通常在Activity或Service中注册,并且要在它们销毁的时候解除注册。
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
发送广播分类
普通广播
使用方法:sendBroadcast()
Intent intent =
new Intent(
"android.provider.Telephony.SMS_RECEIVED");
intent.putExtra(
"data",
"finch");
sendBroadcast(Intent);
普通广播
对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
有序广播
sendOrderedBroadcast(intent,
null);
在有序广播中,我们可以在前一个广播接收者将处理好的数据传送给后面的广播接收者,也可以调用abortBroadcast()来终结广播的传播。
public void onReceive(Context arg0, Intent intent) {
Bundle bundle = getResultExtras(
true);
bundle.putString(
"key",
"777");
setResultExtras(bundle);
abortBroadcast();
}
有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。
onReceive()
一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。 因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。一个Broadcast receiver只有一个回调方法: void onReceive(Context curContext, Intent broadcastMsg) 当Broadcast receiver接收到一条广播信息,android会调用它的onReceive()方法,并传递给它一个包含广播信息的intent对象。当Broadcast receiver在执行这个方法时可以认为它是活动的,onReceive()方法返回时,它便终止了。
广播发送过程
通过sendBroadcast()把一个广播通过Binder发送给ActivityManagerService,ActivityManagerService根据这个广播的Action找到相应的广播接收器,然后把广播放进自己的消息队列中。ActivityManagerService在消息循环中处理这个广播,并通过Binder机制把这个广播分发给注册的ReceiverDispatcher,ReceiverDispatcher把这个广播放进MainActivity所在现成的消息队列中。ReceiverDispatcher的内部类Args在MainActivity所在的线程消息循环中处理这个广播,最终是将这个广播分发给对应的BroadcastReceiver实例处理。
转载请注明原文地址: https://ju.6miu.com/read-15991.html