1.实际使用流程
(1). 创建一个类继承自BroadcastReceiver
(2). 注册:静态注册,动态注册
(3). 消息发送
创建一个类:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
静态注册 在AndroidManifest.xml文件里面添加:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.mirko.reveicer.LANUCH"/>
</intent-filter>
</receiver>
或者动态注册:
IntentFilter filter = new IntentFilter();
filter.addAction("com.mirko.reveicer.LANUCH");
registerReceiver(new MyReceiver(),filter);
发送消息:
Intent intent1 = new Intent();
intent1.setAction("com.mirko.reveicer.LANUCH");
sendBroadcast(intent1);
- 广播注册过程
注册分为动态注册和静态注册,静态广播在应用安装时完成注册,下面看动态广播注册的流程:
registerReceiver() —> ContextImpl里面的registerReceiver()—>进入 registerReceiverInternal() 创建ReceiverDispatcher对象 返回InnerReceiver,同时调用AMS里面的registerReceiver()–> 进入AMS的registerReceiver()方法,储存InnerReceiver及IntentFilter 完成广播注册
/**
mBase.registerReceiver执行的是 ContextImpl里面的registerReceiver()方法
**/
Override
public Intent registerReceiver(
BroadcastReceiver receiver, IntentFilter filter) {
return mBase.registerReceiver(receiver, filter);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
return registerReceiver(receiver, filter, null, null);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
return registerReceiverInternal(receiver, getUserId(),
filter, broadcastPermission, scheduler, getOuterContext());
}
/**
通过调用后,进入registerReceiverInternal()方法
1. mPackageInfo.getReceiverDispatcher()方法获取IntentReceiver对象
2. 通过跨进程注册广播,在AMS里面完成
**/
private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
IntentFilter filter, String broadcastPermission,
Handler scheduler, Context context) {
IIntentReceiver rd = null;
if (receiver != null) {
if (mPackageInfo != null && context != null) {
if (scheduler == null) {
scheduler = mMainThread.getHandler();
}
rd = mPackageInfo.getReceiverDispatcher(
receiver, context, scheduler,
mMainThread.getInstrumentation(), true); // 1.获取IntentReceiver对象
} else {
if (scheduler == null) {
scheduler = mMainThread.getHandler();
}
rd = new LoadedApk.ReceiverDispatcher(
receiver, context, scheduler, null, true).getIIntentReceiver();
}
}
try {
final Intent intent = ActivityManagerNative.getDefault().registerReceiver(
mMainThread.getApplicationThread(), mBasePackageName,
rd, filter, broadcastPermission, userId); //2.通过跨进程注册广播,在AMS里面完成
if (intent != null) {
intent.setExtrasClassLoader(getClassLoader());
intent.prepareToEnterProcess();
}
return intent;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
进入getReceiverDispatcher()方法
1.创建ReceiverDispatcher对象,构造方法中保存InnerReceiver和BroadcastReceiver
2.返回InnerReceiver
**/
public IIntentReceiver getReceiverDispatcher(BroadcastReceiver r,
Context context, Handler handler,
Instrumentation instrumentation, boolean registered) {
synchronized (mReceivers) {
LoadedApk.ReceiverDispatcher rd = null;
ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = null;
if (registered) {
map = mReceivers.get(context);
if (map != null) {
rd = map.get(r);
}
}