android启动过程发送开机广播,Android app启动流程

final void processNextBroadcast(boolean fromMsg) {

synchronized(mService) {

BroadcastRecord r;

mService.updateCpuStats();

if (fromMsg) {

mBroadcastsScheduled = false;

}

while (mParallelBroadcasts.size() > 0) {

r = mParallelBroadcasts.remove(0);

r.dispatchTime = SystemClock.uptimeMillis();

r.dispatchClockTime = System.currentTimeMillis();

final int N = r.receivers.size();

if (app != null && app.thread != null) {

try {

app.addPackage(info.activityInfo.packageName,

info.activityInfo.applicationInfo.versionCode, mService.mProcessStats);

processCurBroadcastLocked(r, app);

return;

} catch (RemoteException e) {

} catch (RuntimeException e) {

return;

}

if ((r.curApp=mService.startProcessLocked(targetProcess,info.activityInfo.applicationInfo, true, r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,

"broadcast", r.curComponent,

(r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))

== null) {

finishReceiverLocked(r, r.resultCode, r.resultData,r.resultExtras, r.resultAbort, false);

scheduleBroadcastsLocked();//重新调度 然后又会回到 deliverToRegisteredReceiverLocked

r.state = BroadcastRecord.IDLE;

return;

}

mPendingBroadcast = r;

mPendingBroadcastRecvIndex = recIdx;

}

processNextBroadcast 继续做广播发送的处理,如果目标在processCurBroadcastLocked

如果目标不存在 就会先建立process,然后重新调度scheduleBroadcastsLocked

private final void processCurBroadcastLocked(BroadcastRecord r,

ProcessRecord app) throws RemoteException {

r.receiver = app.thread.asBinder();

r.curApp = app;

app.curReceiver = r;

app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER);

mService.updateLruProcessLocked(app, false, null);

mService.updateOomAdjLocked();

r.intent.setComponent(r.curComponent);

boolean started = false;

try {

mService.notifyPackageUse(r.intent.getComponent().getPackageName(),

PackageManager.NOTIFY_PACKAGE_USE_BROADCAST_RECEIVER);

app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,

mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),

r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId,

app.repProcState);

started = true;

} finally {

}

}

processCurBroadcastLocked里面就去调用scheduleReceiver表现在应用层就是OnReceiver接收到广播。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值