当前位置: 首页 > news >正文

阿里云做网站送服务器网站建设方案书模板

阿里云做网站送服务器,网站建设方案书模板,重庆便宜做网站的,计算机应用技术是学什么最近大致分析了一把 Activity 启动的流程,趁着今晚刚:swimmer:完精神状态好,把之前记录的写成文章。开门见山,我们直接点进去看 Activity 的 startActivity , 最终,我们都会走到 startActivityForResult 这个方法,我们…

最近大致分析了一把 Activity 启动的流程,趁着今晚刚:swimmer:完精神状态好,把之前记录的写成文章。

开门见山,我们直接点进去看 Activity 的 startActivity , 最终,我们都会走到 startActivityForResult 这个方法,我们可以发现关键的代码:

Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(

this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);

复制代码

我们会发现 Activity 启动其实都经过了一个中转站叫做 Instrumentation , 查看 Instrumentation 的 execStartActivity 方法:

/// 删除了我们不关心的部分

try {

intent.migrateExtraStreamToClipData();

intent.prepareToLeaveProcess(who);

int result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,

intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options);

checkStartActivityResult(result, intent);

} catch (RemoteException e) {

throw new RuntimeException("Failure from system", e);

}

复制代码

我们会发现这里通过 ActivityManager.getService 在进行通信,进去查看,我们发现这个 service 其实是一个 IActivityManager.aidl , 说明这里我们进行了一次 Android 的 IPC。

全局搜索 extends IActivityManager 我们可以发现进行通信的就是 ActivityManagerService , 查看 startActivity 最终可以走到 ActivityStart 的 startActivityMayWait 方法。我们抽取它的关键代码:

54709e37e8cfa66fdaf0b904321a695d.png

这部分我们可以看到根据 intent 解析除了需要的信息,并根据信息去获取了跳转 Activity 的系统权限。

9cd7d13c3c3783cd0393df5456ada6e3.png

这一部分代码,则对 intent 进行了处理和判断,我们基本可以省略这部分非关键逻辑

最终我们会走到 startActivityLocked 方法,并走到 startActivity

098b083081db011901d164460c7df6df.png

这里我们会看到很多对于不同的 ActivityManager 的 状态进行逻辑判断和处理,这里不影响我们的关键流程,我们可以继续往下分析, 分析 doPendingActivityLaunchesLocked 方法

startActivity(pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null,

null, null /*outRecords*/);

复制代码

最终还是会走到另一个重载的 startActivity :

mService.mWindowManager.deferSurfaceLayout();

result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,

startFlags, doResume, options, inTask, outActivity);

复制代码

查看 startActivityUnchecked : 这里代码逻辑比较长,我们查看 ActivityStackSupervisor 的 .resumeFocusedStackTopActivityLocked 方法

1a916b478b399539ff6ac9663674d7ef.png

继续查看 resumeTopActivityUncheckedLocked 方法, 跟踪到 resumeTopActivityInnerLocked 方法:

c75f1ee9b81dd508d928e218acb65a36.png

这边我们查看需要 restart 这个 Activity 的简单情况,会调用 ActivityStackSupervisor 的 startSpecificActivityLocked 方法

506b35293846e2f257b4b761164735cf.png

这里我们找到了逻辑的关键:如果 app的线程和进程都存在,我们会执行 realStartActivityLocked 方法。否则,会继续进行 IPC 通知 ActivityManagerService 去执行 startProcessLocked

这里我们差不多能猜到启动逻辑:

如果启动的是我们自己 app 进程的 Activity, 那么直接去启动就好了

如果我们启动的 Activity 所在的进程不存在,例如:我们把微信 kill 了,然后跳转微信分享的 Activity,或者我们点击launch 的微信图标,那么,我么就会走创建新进程的逻辑

那么我们分别来跟踪这2种情况:

启动自己的Activity

1722b8d2bddc091c6c654b5a83cfedd0.png

我们可以找到这段代码的关键逻辑,我们先分析下 app.thread 是什么。跟踪进去会发现是一个 IApplicationThread , 可以发现这里又是一个 aidl, 最后我们可以找到 ApplicationThread ,

private class ApplicationThread extends IApplicationThread.Stub

复制代码

这是 ActivityThread 的一个静态内部类,ActivtyThread和启动Activity 相关,那么这个类就应该是和 Application 启动相关。

3d7bb02312f718483ee9dabba23d323e.png

我们会发现最后其实发了一个message 到消息队列中,找到 H 这个 handler 的 handleMessage 方法

case LAUNCH_ACTIVITY: {

final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

r.packageInfo = getPackageInfoNoCheck(

r.activityInfo.applicationInfo, r.compatInfo);

handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");

} break;

复制代码

查看 handleLaunchActivity 方法

Activity a = performLaunchActivity(r, customIntent);

复制代码

在 performLaunchActivity 方法中可以看到

java.lang.ClassLoader cl = appContext.getClassLoader();

activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);

复制代码

这里,我们发现这里通过 Insteumentation new 了一个 Activity

8053de414399ee208b0524839005e566.png

970a9315106ca176576946e99d128f4d.png

通过以上代码,我们还可以发现 new 出 Activity 后的几个步骤

onCreate

onRestoreInstance

onCreate

到这里,我们的 Activity 就启动成功了

启动新的进程

下面来分析我们的第二种情况,我们可以跟踪到 ActivityManagerService 的 `startProcessLocked 方法, 这个方法最终会走到自己的重载方法:

3dc4c0eee54f901addcc273d59fd05c2.png

如果我们启动的是一个 webview service, 则会走到 startWebView ,这里我们不考虑,所以我们分析的是 Process.start 这种初始化一个普通进程的情况。

这个方法最后调用了 ZygoteProcess 的 start 方法

6df973d48ed54bc6cd65b0a4ec44b1ba.png

这里我们也可以大致分析出来,这里就是在通过 socket 通信请求 Zygote 进程 fork 一个子进程,作为新的 APP 进程,具体流程本篇文章暂时不做深究。

最终我们会启动 ActivityThread 的 main 方法,继续走到 attach 方法

这里我们能看到启动主线程的 Looper, 创建系统 Context 等工作,最终我们走到 ApplicationThread 的 bindApplication , 代码这里就不贴了,这里负责了 Application 在初始化的时候的各种工作。包括 LoadedAPK 的 makeApplication 过程。

if (normalMode) {

try {

if (mStackSupervisor.attachApplicationLocked(app)) {

didSomething = true;

}

} catch (Exception e) {

Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);

badApp = true;

}

}

复制代码

这里会发现,正常模式下,我们走到了 ActivityStackSupervisor 的 attachApplicationLocked 方法,后面就又会和第一部分介绍的一样,走到 realStartActivityLocked 方法,去创建并执行 Activity 的生命周期。

总结

到这里,Activity 的启动流程就大致梳理出来了。基本就是, Instrumentation 负责 Activity 的创建和中转, ActivityStackSupervisor 负责 Activity的 栈管理。Activity 都通过了 ActviityServerManager 来进行管理。

大概的关系如下图所示:

c6eb8854045f0798e3e7b3dea305a122.png

http://www.lbrq.cn/news/2763811.html

相关文章:

  • 怎么做网站赚钱吗免费网站建站页面
  • 和文化有关的吉网站建设模板线上推广外包公司
  • 成都广告公司招聘广告制作安装百度seo整站优化
  • 网站建设有哪些需要注意的关键细节今日特大新闻新事
  • 企业策划公关公司靠谱seo整站优化外包
  • 临沂网站建设制作南宁网络推广平台
  • wordpress分享卡片插件seo研究中心超逸seo
  • 可以举报一个做网络网站发大财吗长沙网络营销顾问
  • 宁晋县建设局网站搜索引擎推广的优势
  • 哈尔滨网站设计公司地址推广产品的渠道
  • wordpress页面教程视频教程seo查询百科
  • 时间管理系统 网站开发深圳网络营销模式
  • 威海高新园区建设运营有限公司网站百度广告位价格
  • 丽水网站建设专业的公司沈阳seo网站推广
  • 建设银行普卡申请网站在线网页制作系统搭建
  • 深圳做网站建设公司企业网站建设
  • 兰州网站建设百度官网首页登录入口
  • 建设银行手机短信网站怎么开通短视频推广渠道有哪些
  • 知名网站建设定制英雄联盟最新赛事
  • 潍坊建立企业网站公司爱站seo
  • 长春网站外包运营推广怎么做
  • 郑州网站建设幸巴网址查询
  • 外贸用什么平台自建站较好长沙网站推广排名优化
  • 可以用足球做的游戏视频网站nba最新新闻消息
  • 域名绑定网站百度客服怎么联系
  • 大连网站开发选领超科技宁德市人力资源和社会保障局
  • 手机网站制作代码与web有什么不同竞价托管代运营
  • 怎么做套版网站代运营一个月多少钱
  • 福州外贸建站江苏企业网站建设
  • 网站建设深圳亿联时代太原seo快速排名
  • k8sday10服务发现(1/2)
  • 【前端面试题】JavaScript 核心知识点解析(第一题到第十三题)
  • Linux内存管理系统性总结
  • 基于遗传编程的自动程序生成
  • 2023年全国研究生数学建模竞赛华为杯F题强对流降水临近预报求解全过程文档及程序
  • 解决html-to-image在 ios 上dom里面的图片不显示出来