其然IT教育科技有限公司,是一家专注于培养高级IT技术 人才,为学员提供定制化IT职业规划方案及意见咨询服务的教育科技公司。秉着“全心全意为学员服务,认认真真做好教育工作,凡事多做一点,别太 计较得失”的企业文化,立志打造一个教学专业并紧跟当下流行前沿技术,让学员保持强有力的核心竞争力、在企业中具有真正实战能力,让更多有梦 想的年轻人学到实实在在有价值的知识,让知识真正改变命运的IT培训品牌。公司CEO不仅是明星讲师亦是知名独立框架开发者,其开发的2个世界通用 流行开源框架(MJRefresh、MJExtension),曾经在苹果开发github排名OC语言分类中领导全球排名。因其独特的个人魅力及一贯的坚守吸引了众多实战 派讲师纷纷加入,共同构造了小码哥与时俱进的教研团队。其然IT教育自成立以来硕果累累:陆续开设6大学科;累计培训几千名学员高薪就业;曾为 中国中央电视台CCTV发现之旅《华商论见》栏目组特约战略合作伙伴,双方在传媒、网络媒体、人才输送等方面拥有着广泛的合作。2015年下旬,其然 IT教育凭借其优良的口碑荣获“2015中国IT教育培训行业**具影响力领军品牌”、“2015年度互联网责任品牌”等多项大奖。
多年Java开发从业者:首先,这个问题主要问:自学Java编程技术,如果才 能找到一份Java编程的工作。按照现在的招聘标准来看,无论你去哪个公司面试,你只需要满足他们公司的需求就可以。
找到一份Java编程工作需要掌握的内容如下 :
首先是Javase作为Java**基本的学习 内容,不在多说。
然后是掌握Java的基本原理,因为做Java 编程开发必须学会Java,用到Java非常多,但是现在很多公司是不用去写原生的Java,但是如果你想成为一个厉害的Java开发者,Java必须从理论到实 际操作中都要非常得心应手。
现在公司是必须要求会用框架的,所以取代Java的就是jQuery,这是一个非 常简易的框架,学jQuery的时候你就会觉得它比Java好用的多。所以jQuery是你必须掌握的。
还有必须学一些框架,比如SpringMVC、Spring、Mybatis、Struts、Hibernate等等,这些就会难理解一些,但是公司是需要要求你会框架的,目前国内的公司应用SSH比 较多,建议至少学三个框架,这是找到工作的基本需求。
数据库技术是Java工作者必须掌握的技能常用就是Mysql。
Javaweb的内容还有html、css、jsp、Servlet等技术,这些都是现在找Java开发必须掌握的东西。
以上就是粗略的必须掌握的技术,如果你想找到一份Java开发的工作,上述 相关技术必须熟练掌握并且应用到项目中。
Java基础语法
Java基础语法
Java基础语法
流程控制语句
Java 编译器执行流程
if 分支结构
switch 选择结构与相关规则
循环结构
for 循环
while 循环
do-while 循环语句
各语句性能对比与应用场景
特殊流程控制语句
方法的声明与使用
方法调用的过程分析
跨类调用方法
参数的值传递
方法的重载 Overload
图解Activity的启动过程
>
由于Activity的启动涉及大量ipC和Binder方面的知识,因此了解这方面的知识后再来看Activity启动的相关源码可能不会那么吃力。
Activity启动时涉及到的类有IActivityManager相关类, IapplicationThread相关类, ActivityManagerService相关类。
Activity的管理采用binder机制,管理Activity的接口是IActivityManager。ActivityManagerService实现了Activity管理功能,位于system_server进程。从ActivityManagerService提供的接口来看,它负责管理Activity的启动和生命周期。
ActivityManagerPRoxy对象是ActivityManagerService在普通应用进程的一个代理对象,应用进程通过ActivityManagerProxy对象调用ActivityManagerService提供的功能。应用进程并不会直接创建ActivityManagerProxy对象,而是通过调用ActiviyManagerNative类的工具方法getDefault方法得到ActivityManagerProxy对象。所以在应用进程里通常这样启动Activty:
ActivityManagerNative.getDefault().startActivity()
应用进程需要调用ActivityManagerService提供的功能,返过来,ActivityManagerService也需要调用应用进程的回调操作以达到控制和调配应用进程的目的。因此,ActivityManagerService也有一个Binder对象–ApplicationThreadProxy,它是IApplicationThread的代理对象。
ApplicationThread类实现了IApplicationThread接口,实现了管理应用的操作,ApplicationThread对象运行在应用进程里,内部包含了大量启动和停止Activity的接口,此外还包含了启动和停止服务的接口。但因为ApplicationThread运行在Binder线程,这些接口方法大多都通过Handler传给ActivityThread的内部的H来执行。
其实,ApplicationThread是ActivityThread的内部类,H其实是一个Handler,也是ActivityThread的一个内部类,运行在主线程。对于每一个应用程序来说,都有一个ActivityThread来表示一个应用主线程。
总的来说ActivityManagerService,ApplicationThread和ActivityThread之间的关系。ActivityManagerService可以说是Activity的启动入口,相当于主国。ApplicationThread相当于外交**,作为ActivityManagerService与ActivityThread之间的信使,负责将ActivityManagerService下达的指令呈给ActivityThread的H来处理,以及将ActivityThread的调用请求传给ActivityManagerService。ActivityThread则相当于诸侯国,对自己辖区内(应用进程)的Activity有直接的控制权,承担Activity启动的大部分工作,但Activity的户口(ActivityStack)在ActivityManagerService手里。因为ActivityManagerService需要统一调控不同应用进程中的Activity。
系统每一次启动Activity,先调用Instrumentation的execStartActivity方法。Instrumentation是负责监控Activity与系统的交互操作的,相当于系统运行日志,因此要启动activity或回调activity的生命周期的方法时,都会先调用Instrumentation相关方法。
经过IPC调用,启动Activity的指令来到了ActivityManagerService,紧接着AMS调用startActivityAsUser着手Activity的启动工作。
AMS有一个ActivityStack,负责Activity的调度工作,比如维护回退栈。但ActivityStack内的Activity是抽象成ActivityRecord来管理的。Activity对象不会存在于AMS当中。
ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>();由于Activity之间的调度关系受很多因素的影响而变得非常复杂,Google使用了ActivityStack和ActivityStackSupervisor,以及Android 7.0添加的ActivityStarter来管理Activity的调度工作。此三者的调用过程如下图:
由于它们之间调用过程比较复杂,下面只从挑重点来看。
startActivityMayWait这个方法会创建ActivityRecord对象,再调用startActivityLocked。
这个方法会根据Activity启动信息(提取封装到ActivityInfo类中)中的launchMode,flag等属性来调度ActivityStack中的Task和ActivityRecord。因此这个方法是理解Activity启动模式的关键。
这个方法内部会把前台处于Resume状态的Activity变成Pause状态后才会继续启动Activity的逻辑。
将一个Activity变成Pause状态需要经历的调用于后面的启动调用非常相似。
startPausingLocked->ApplicationThread.schedulePauseActivity->mH.sendMessage->ActivityThread.handlePauseActivity->ActivityManagerService.activityPaused->ActivityStack.activityPausedLocked->ActivityStack.completePauseLocked。
在completePauseLocked方法中又一次调用:
mStackSupervisor.resumeFocusedStackTopActivityLocked(topStack, prev, null);又回到了resumeTopActivityInnerLocked方法中,这时会调用ActivityStack.startSpecificActivityLocked方法。
这里**后会调用AMS的startProcessLocked,这个方法会先判断是否已经存在相应的进程,如果不存在则通过远程调用Zygote进程来孵化出新的应用进程,Zygote进程孵化出新的应用进程后,会执行ActivityThread类的main方法。在该方法里会先准备好Looper和消息队列,然后调用attach方法将应用进程绑定到ActivityManagerService,然后进入loop循环,不断地读取消息队列里的消息,并分发消息。这个过程在Android的消息机制里已经非常熟悉了。其中attach方法在与AMS绑定的过程中会调用attachApplicationLocked方法。attachApplicationLocked方法有两个重要的函数调用thread.bindApplication和mMainStack.realStartActivityLocked。thread.bindApplication将应用进程的ApplicationThread对象绑定到ActivityManagerService,也就是说获得ApplicationThread对象的代理对象。mMainStack.realStartActivityLocked通知应用进程启动Activity。
然后启动Activity的代码逻辑来到了realStartActivityLocked。
app.thread其实就是ApplicationThread在AMS的代理对象,实际上是调用ApplicationThread#scheduleLaunchActivity。接下来Activity的启动工作就交给应用进程来完成了,别忘了这时候的Activity对象还没被创建呢。
ApplicationThread接收到来自AMS的Activity启动命令后,将启动消息通过H(extends Handler)对象发给ActivityThread。
handleLauchActivity方法中包含了ActivityThread中启动Activity的几乎全部逻辑,这个方法内会调用两个重要的方法:performLaunchActivity和handleResumeActivity。
performLaunchActivity方法内完成了如下工作:
通过类加载器加载Activity对象 创建ContextImpl对象并调用activity的attach方法,把上下文变量设置进activity中,创建Window对象和设置WindowManager。 回调onCreate,onStart和onRestoreInstanceState方法。handleResumeActivity方法内完成了如下工作:
回调Activity的onResume方法 调用WindowManager的addView方法,将前面在attach方法内创建出来的window对象添加到WindowManager当中。关于setContentView:
通常setContentView会在Activity的onCreate方法中调用。但必须要在onCreate中调用吗?其实setContentView完成了DecorView的创建和绘制,只要在调用WindowManager#addView之前调用setContentView方法也是OK的。因此,**迟到onResume方法中调用setContentView也是可以的。
完整图片
《Android开发艺术探索》 Android应用程序内部启动Activity过程(startActivity)的源代码分析
Android应用程序启动过程源代码分析
Android应用程序的Activity启动过程简要介绍和学习计划
深入理解Activity启动流程(一)–Activity启动的概要流程 深入理解Activity启动流程(二)–Activity启动相关类的类图 深入理解Activity启动流程(三)–Activity启动的详细流程1 深入理解Activity启动流程(三)–Activity启动的详细流程2
startActivity启动过程分析
相关推荐:
Copyright © 2006-2018 kaoshi.china.com