关键词:
文章目录
前言
在上一篇博客 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 ) 分析了从 ActivityThread
的 main()
函数启动 , ApplicationThread
绑定 , Application
创建 , 下面继续分析后续内容 ;
一、ActivityManagerService.attachApplicationLocked
回到 AMS 中的 ActivityManagerService
方法 , 在调用 ActivityThread
绑定 ApplicationThread
后 ,
有调用了 mStackSupervisor.attachApplicationLocked
方法 , 查看顶部可见 Activity 是否正等待在此进程中运行 ;
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback
// 为 ActivityThread 绑定 ApplicationThread 主方法
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid)
try
checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");
mStackSupervisor.mActivityMetricsLogger.notifyBindApplication(app);
// 在此处为 ActivityThread 绑定 ApplicationThread , 此时又回到 ActivityThread
if (app.instr != null)
thread.bindApplication(processName, appInfo, providers,
app.instr.mClass,
profilerInfo, app.instr.mArguments,
app.instr.mWatcher,
app.instr.mUiAutomationConnection, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
isRestrictedBackupMode || !normalMode, app.persistent,
new Configuration(getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial);
else
thread.bindApplication(processName, appInfo, providers, null, profilerInfo,
null, null, null, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
isRestrictedBackupMode || !normalMode, app.persistent,
new Configuration(getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial);
catch (Exception e)
// 查看顶部可见 Activity 是否正在等待在此进程中运行
if (normalMode)
try
if (mStackSupervisor.attachApplicationLocked(app))
didSomething = true;
catch (Exception e)
Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
badApp = true;
return true;
ActivityManagerService 完整源码参考 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
二、ActivityStackSupervisor.attachApplicationLocked
在上述 AMS 中的 attachApplicationLocked
方法中 , 调用了 ActivityStackSupervisor
的 attachApplicationLocked
方法 ,
在 ActivityStackSupervisor.attachApplicationLocked
方法中 , 调用了 ActivityStackSupervisor.realStartActivityLocked
方法 ;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,
RecentTasks.Callbacks
boolean attachApplicationLocked(ProcessRecord app) throws RemoteException
// 省略其它代码 , 在此处调用了 realStartActivityLocked 方法
if (realStartActivityLocked(activity, app,
top == activity /* andResume */, true /* checkConfig */))
didSomething = true;
return didSomething;
完整代码参考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;
三、ActivityStackSupervisor.realStartActivityLocked
该方法步骤在 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 二 ) 二、AMS 进程中执行的相关操作 章节进行过讲解 , 不管是冷启动 , 还是热启动 , 都要调用 ActivityStackSupervisor.realStartActivityLocked
方法开启 Activity
;
后续逻辑基本就与该博客后续的分析对应上了 ;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,
RecentTasks.Callbacks
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException
if (!allPausedActivitiesComplete())
// 当有活动暂停时,我们将跳过开始任何新活动,直到暂停完成。
// 注意:对于在暂停状态下启动的活动,我们也会这样做,因为它们将首先恢复,然后在客户端暂停。
if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,
"realStartActivityLocked: Skipping start of r=" + r
+ " some activities pausing...");
return false;
final TaskRecord task = r.getTask();
final ActivityStack stack = task.getStack();
beginDeferResume();
try
r.startFreezingScreenLocked(app, 0);
// 安排启动时间以收集有关慢速应用程序的信息。
r.startLaunchTickingLocked();
r.setProcess(app);
if (getKeyguardController().isKeyguardLocked())
r.notifyUnknownVisibilityLaunched();
// 让窗口管理器根据新的活动顺序重新评估屏幕方向。
// 注意,这样做的结果是,它可以使用新的方向调用activity manager。
// 我们不关心这一点,因为活动当前未运行,所以我们只是重新启动它。
if (checkConfig)
// 推迟恢复,因为我们将很快启动新活动。
// 我们不希望在确保配置和尝试恢复重点堆栈的顶级活动的同时,重复启动同一记录。
ensureVisibilityAndConfig(r, r.getDisplayId(),
false /* markFrozenIfConfigChanged */, true /* deferResume */);
if (r.getStack().checkKeyguardVisibility(r, true /* shouldBeVisible */,
true /* isTop */))
// 仅当基于keyguard状态允许活动可见时,我们才将可见性设置为true。
// 这样可以避免在窗口管理器中将此设置为运动状态,
// 而由于以后的调用而取消该设置,以确保将可见性设置回false的可见活动。
r.setVisibility(true);
try
// 下面的代码是启动 Activity 的核心代码
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
r.appToken);
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separate global
// and override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, mService.isNextTransitionForward(),
profilerInfo));
// 设置所需的最终状态。配置生命周期
final ActivityLifecycleItem lifecycleItem;
if (andResume)
// 开启新的 Activity
lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
else
// 终止 Activity
lifecycleItem = PauseActivityItem.obtain();
clientTransaction.setLifecycleStateRequest(lifecycleItem);
// 安排事务。
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
// 上面的代码是启动 Activity 的核心代码
catch (RemoteException e)
finally
endDeferResume();
return true;
完整代码参考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;
android6.0源码分析之activity启动过程
Activity最为android开发者最熟悉的组件,由ActivityManagerService服务进行调度管理,而ActivityManagerService的启动过程在activitymanagerservice服务源码分析一文中进行了详细分析,本文基于其对Activity的启动过程进行分析,同... 查看详情
android启动过程activity启动源码分析(ams->activitythreadams线程阶段)(代码片段)
文章目录一、Activity启动源码分析(AMS|ActivityManagerService)1、Instrumentation调用AMS方法2、ActivityStarter调用AMS方法3、Process启动新进程二、Activity启动源码分析(ActivityStarter)1、ActivityStarter.startActivityMayWait()方法2、ActivityStart 查看详情
android启动过程activity启动源码分析(ams->activitythreadams线程阶段二)(代码片段)
...r机制转到ActivityThread中执行的操作总结前言上一篇博客【Android启动过程】Activity启动源码分析(AMS->ActivityThread、AMS线程阶段)分析的分支是启动Activity时,没有Activity对应的进程,需要先调用Zygote启动相应进程,然后再启动Activ 查看详情
android启动过程activity启动源码分析(activitythread流程分析一)(代码片段)
文章目录一、ActivityThread主函数启动二、ActivityThread绑定ApplicationThread三、AMSattachApplication->attachApplicationLocked绑定ApplicationThread四、ApplicationThread.bindApplication绑定ApplicationThread五、ActivityThread. 查看详情
android启动过程activity启动源码分析(activitythread->activity主线程阶段一)(代码片段)
文章目录前言一、ClientTransactionHandler.scheduleTransaction二、ActivityThread.H处理EXECUTE_TRANSACTION消息三、TransactionExecutorexecute->executeCallbacks方法四、LaunchActivityItem.execute总结前言上一篇博客【Android启动过程】Activi 查看详情
android启动过程activity启动源码分析(activitythread->activity主线程阶段二)(代码片段)
文章目录前言一、ActivityThread类handleLaunchActivity->performLaunchActivity方法二、Instrumentation.newActivity方法三、AppComponentFactory.instantiateActivityCompat方法四、ActivityThread.performLaunchActivity方法后续细节五、Ins 查看详情
android6.0源码分析之activity启动过程
Activity最为android开发者最熟悉的组件,由ActivityManagerService服务进行调度管理,而ActivityManagerService的启动过程在activitymanagerservice服务源码分析一文中进行了详细分析,本文基于其对Activity的启动过程进行分析,同... 查看详情
基于android10.0源码分析activity的启动流程(代码片段)
一、梳理源码流程干什么Activity是四大组件中最重要的组件之一,下面来分析Activity的启动过程,了解Activity的启动过程能帮助我们更好的对组件Activity的理解,也能帮助我们更好的把控Activity生命周期的变化过程。当... 查看详情
基于android10.0源码分析activity的启动流程(代码片段)
一、梳理源码流程干什么Activity是四大组件中最重要的组件之一,下面来分析Activity的启动过程,了解Activity的启动过程能帮助我们更好的对组件Activity的理解,也能帮助我们更好的把控Activity生命周期的变化过程。当... 查看详情
android应用启动流程分析(代码片段)
1前言网上看过很多Activity启动过程的源码解析,很多文章会贴上一大段代码,然后从startActivity()函数开始深究整个源码的调用栈。个人感觉这类文章代码细节太多,反而容易迷失在源码调用之中,从而忽略了Activit... 查看详情
activity启动过程——10.0源码分析(代码片段)
对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程。在windows系统看,看源码可以通过源码阅读 这个网址查看... 查看详情
android应用启动流程分析(代码片段)
1前言网上看过很多Activity启动过程的源码解析,很多文章会贴上一大段代码,然后从startActivity()函数开始深究整个源码的调用栈。个人感觉这类文章代码细节太多,反而容易迷失在源码调用之中,从而忽略了Activit... 查看详情
android源码分析startservice启动(代码片段)
startService启动过程ContextImpl到AMS的调用过程当我们在Activity中调用startActivity函数的时候,点击startActivity看源码实现会发现它是在ContextWrapper类中实现的。我们继续看Context的startService实现,代码如下://Context.javapublicabstractcla... 查看详情
android源码分析startservice启动(代码片段)
startService启动过程ContextImpl到AMS的调用过程当我们在Activity中调用startActivity函数的时候,点击startActivity看源码实现会发现它是在ContextWrapper类中实现的。我们继续看Context的startService实现,代码如下://Context.javapublicabstractcla... 查看详情
android源码分析activity启动(代码片段)
Android 启动类的作用Instrumentation 完成对Application和Activity初始化和生命周期调用的工具类。用来监控系统与应用的交互。ActivityThread 管理应用进程的主线程的执行。ApplicationThread 用来实现ActivityManagerService与ActivityT... 查看详情
activity启动过程——10.0源码分析(代码片段)
对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程。在windows系统看,看源码可以通过源码阅读 这个网址查看... 查看详情
androidactivity——启动过程探索(代码片段)
《Android自定义View之Activity页面的组成》《AndroidActivity——启动过程探索(一)》《AndroidActivity——启动过程探索(二)》《AndroidActivity——启动过程探索(三)》《Activity启动模式及任务栈探究》《Activity... 查看详情
app启动过程(含activity启动过程)|安卓offer收割基
...: 布兰柯基本文链接: https://blankj.com/2018/12/18/android-adapt-screen-killer/618,祝大家购物愉快,文末有彩蛋~~这道题在曾经面试「菜鸟网络」中遇到过,不过当时只问了「Activity启动过程」,这里对整个「App启... 查看详情