Android应用程序发送广播(sendBroadcast)的过程分析(2)
-
final boolean replacePending =
-
(intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0;
-
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
-
if (!ordered && NR > 0) {
-
// If we are not serializing this broadcast, then send the
-
// registered receivers separately so they don't wait for the
-
// components to be launched.
-
BroadcastRecord r = new BroadcastRecord(intent, callerApp,
-
callerPackage, callingPid, callingUid, requiredPermission,
-
registeredReceivers, resultTo, resultCode, resultData, map,
-
ordered, sticky, false);
-
......
-
boolean replaced = false;
-
if (replacePending) {
-
for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
-
if (intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
-
......
-
mParallelBroadcasts.set(i, r);
-
replaced = true;
-
break;
-
}
-
}
-
}
-
-
if (!replaced) {
-
mParallelBroadcasts.add(r);
-
-
scheduleBroadcastsLocked();
-
}
-
-
registeredReceivers = null;
-
NR = 0;
-
}
-
public final class ActivityManagerService extends ActivityManagerNative
-
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
-
......
-
-
private final void scheduleBroadcastsLocked() {
-
......
-
-
if (mBroadcastsScheduled) {
-
return;
-
}
-
-
mHandler.sendEmptyMessage(BROADCAST_INTENT_MSG);
-
mBroadcastsScheduled = true;
-
}
-
-
......
-
}
-
public final class ActivityManagerService extends ActivityManagerNative
-
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
-
......
-
-
final Handler mHandler = new Handler() {
-
public void handleMessage(Message msg) {
-
switch (msg.what) {
-
......
-
case BROADCAST_INTENT_MSG: {
-
......
-
processNextBroadcast(true);
-
} break;
-
......
-
}
-
}
-
}
-
-
......
-
}
-
public final class ActivityManagerService extends ActivityManagerNative
-
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
-
......
-
-
private final void processNextBroadcast(boolean fromMsg) {
-
synchronized(this) {
-
BroadcastRecord r;
-
-
......
-
-
if (fromMsg) {
-
mBroadcastsScheduled = false;
-
}
-
-
// First, deliver any non-serialized broadcasts right away.
-
while (mParallelBroadcasts.size() > 0) {
-
r = mParallelBroadcasts.remove(0);
-
......
-
final int N = r.receivers.size();
-
......
-
for (int i=0; i<N; i++) {
-
Object target = r.receivers.get(i);
-
......
-
-
deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false);
-
}
-
addBroadcastToHistoryLocked(r);
-
......
-
}
-
-
......
-
-
}
-
}
-
-
......
-
}
-
public final class ActivityManagerService extends ActivityManagerNative
-
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
-
......
-
-
private final void deliverToRegisteredReceiverLocked(BroadcastRecord r,
-
BroadcastFilter filter, boolean ordered) {
-
boolean skip = false;
-
if (filter.requiredPermission != null) {
-
......
-
}
-
if (r.requiredPermission != null) {
-
......
-
}
-
-
if (!skip) {
-
// If this is not being sent as an ordered broadcast, then we
-
// don't want to touch the fields that keep track of the current
-
// state of ordered broadcasts.
-
if (ordered) {
-
......
-
}
-
-
try {
-
......
-
performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
-
new Intent(r.intent), r.resultCode,
-
r.resultData, r.resultExtras, r.ordered, r.initialSticky);
-
......
-
} catch (RemoteException e) {
-
......
-
}
-
}
-
-
}
-
-
......
-
}
-
public final class ActivityManagerService extends ActivityManagerNative
-
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
-
......
-
-
static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver,
-
Intent intent, int resultCode, String data, Bundle extras,
-
boolean ordered, boolean sticky) throws RemoteException {
-
// Send the intent to the receiver asynchronously using one-way binder calls.
-
if (app != null && app.thread != null) {
-
// If we have an app thread, do the call through that so it is
-
// correctly ordered with other one-way calls.
-
app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
-
data, extras, ordered, sticky);
-
} else {
-
......
-
}
-
}
-
-
......
-
}
这个函数定义在frameworks/base/core/java/android/app/ApplicationThreadNative.java文件中:
-
class ApplicationThreadProxy implements IApplicationThread {
-
......
-
-
public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent,
-
int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky)
-
throws RemoteException {
-
Parcel data = Parcel.obtain();
-
data.writeInterfaceToken(IApplicationThread.descriptor);
-
data.writeStrongBinder(receiver.asBinder());
-
intent.writeToParcel(data, 0);
-
data.writeInt(resultCode);
-
data.writeString(dataStr);
-
data.writeBundle(extras);
-
data.writeInt(ordered ? 1 : 0);
-
data.writeInt(sticky ? 1 : 0);
-
mRemote.transact(SCHEDULE_REGISTERED_RECEIVER_TRANSACTION, data, null,
-
IBinder.FLAG_ONEWAY);
-
data.recycle();
-
}
-
-
......
-
}
这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:
-
public final class ActivityThread {
-
......
-
-
private final class ApplicationThread extends ApplicationThreadNative {
-
......
-
-
// This function exists to make sure all receiver dispatching is
-
// correctly ordered, since these are one-way calls and the binder driver
-
// applies transaction ordering per object for such calls.
-
public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent,
-
int resultCode, String dataStr, Bundle extras, boolean ordered,
-
boolean sticky) throws RemoteException {
-
receiver.performReceive(intent, resultCode, dataStr, extras, ordered, sticky);
-
}
-
-
......
-
}
-
-
......
-
-
}
-
final class LoadedApk {
-
......
-
-
static final class ReceiverDispatcher {
-
-
final static class InnerReceiver extends IIntentReceiver.Stub {
-
......
-
-
public void performReceive(Intent intent, int resultCode,
-
String data, Bundle extras, boolean ordered, boolean sticky) {
-
-
LoadedApk.ReceiverDispatcher rd = mDispatcher.get();
-
......
-
if (rd != null) {
-
rd.performReceive(intent, resultCode, data, extras,
-
ordered, sticky);
-
} else {
-
......
-
}
-
}
-
}
-
-
......
-
}
-
-
......
-
}
-
final class LoadedApk {
-
......
-
-
static final class ReceiverDispatcher {
-
......
-
-
public void performReceive(Intent intent, int resultCode,
-
String data, Bundle extras, boolean ordered, boolean sticky) {
-
......
-
-
Args args = new Args();
-
args.mCurIntent = intent;
-
args.mCurCode = resultCode;
-
args.mCurData = data;
-
args.mCurMap = extras;
-
args.mCurOrdered = ordered;
-
args.mCurSticky = sticky;
-
if (!mActivityThread.post(args)) {
-
......
-
}
-
}
-
-
......
-
}
-
-
......
-
}
-
final class LoadedApk {
-
......
-
-
static final class ReceiverDispatcher {
-
......
-
-
final class Args implements Runnable {
-
......
-
-
public void run() {
-
BroadcastReceiver receiver = mReceiver;
-
-
......
-
-
Intent intent = mCurIntent;
-
-
......
-
-
try {
-
ClassLoader cl = mReceiver.getClass().getClassLoader();
-
intent.setExtrasClassLoader(cl);
-
if (mCurMap != null) {
-
mCurMap.setClassLoader(cl);
-
}
-
receiver.setOrderedHint(true);
-
receiver.setResult(mCurCode, mCurData, mCurMap);
-
receiver.clearAbortBroadcast();
-
receiver.setOrderedHint(mCurOrdered);
-
receiver.setInitialStickyHint(mCurSticky);
-
receiver.onReceive(mContext, intent);
-
} catch (Exception e) {
-
......
-
}
-
-
......
-
}
-
-
......
-
}
-
-
......
-
}
-
-
......
-
}
-
public class MainActivity extends Activity implements OnClickListener {
-
......
-
-
private BroadcastReceiver counterActionReceiver = new BroadcastReceiver(){
-
public void onReceive(Context context, Intent intent) {
-
int counter = intent.getIntExtra(CounterService.COUNTER_VALUE, 0);
-
String text = String.valueOf(counter);
-
counterText.setText(text);
-
-
Log.i(LOG_TAG, "Receive counter event");
-
}
-
}
-
-
......
-
-
}
至此,Android应用程序发送广播的过程就分析完成了,结合前面这篇分析广播接收器注册过程的文章 Android应用程序注册广播接收器(registerReceiver)的过程分析 ,就会对Android系统的广播机制且个更深刻的认识和理解了。