本文章向大家介绍AndroID app应用启动的一些相关知识,包括app启动方式、app启动流程和app启动优化等知识!
app应用启动方式
1、冷启动
当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。
2、热启动
当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。
app应用启动流程
为方便排版,去掉部分方法中的参数:
从Activity类的startActivity()方法开始,这个方法会调用Activity类中的public voID startActivityForResult()方法 startActivityForResult()方法会调用Instrumentation类中的public ActivityResult execStartActivity()方法,这个方法加上了{@hIDe}对外是不可见的 execStartActivity()方法中有如下的调用语句ActivityManagerNative.getDefault().startActivity(),它调用了IActivityManager类中的startActivity()方法 但IActivityManager其实只是一个接口,这里实际调用的是public abstract classActivityManagerNative这个类(它继承自Binder类)的内部类ActivityManagerProxy中的public int startActivity()方法,ActivityManagerProxy实现了IActivityManager接口 ActivityManagerProxy类的public int startActivity()方法中有如下代码,mRemote.transact(START_ACTIVITY_TRANSACTION,data,reply,0),这里mRemote是一个IBinder对象,这个对象在ActivityManagerProxy构造方法中实例化,实际由外部类ActivityManagerNative的static public IActivityManager asInterface(IBinder obj)方法实例化,asInterface(IBinder obj)方法中参数实际在ActivityManagerNative类的static public IActivityManager getDefault()方法中,由ServiceManager.getService("activity")实例化 mRemote.transact(START_ACTIVITY_TRANSACTION,0)这条语句通过IBinder的transact()方法,将方法中的参数跨进程传递给ActivityManagerService类 以上除ActivityManagerService类之外的类都位于androID.app包下 下面进入ActivityManagerService类,它位于源码的/frameworks/base/services/java/com/androID/server/am/路径下,包名是com.androID.server.am ActivityManagerService继承了ActivityManagerNative类,从ActivityManagerProxy类的mRemote.transact()传递过来的参数,被传递到ActivityManagerService类的onTransact()方法来处理 ActivityManagerService类的onTransact()方法实际上通过super.onTransact(code,flags)这条语句又调用了ActivityManagerNative类中的onTransact()方法 super.onTransact(code,flags)这条语句会调用到ActivityManagerService类的public final int startActivity()方法 ActivityManagerService类的startActivity()方法会调用到ActivityStack类的startActivityMayWait()方法 ActivityStack类位于com.androID.server.am包下,startActivityMayWait()方法final int startActivityLocked()方法 startActivityLocked()方法最后会调用final boolean resumetopActivityLocked()方法 resumetopActivityLocked()方法会调用private final voID startSpecificActivityLocked()方法 startSpecificActivityLocked()方法会调用startProcessLocked()方法 startProcessLocked()方法会调用androID.os.Process类的public static final int start()方法 int pID = Process.start("androID.app.ActivityThread",mSimpleProcessManagement ? app.processname : null,uID,gIDs,deBUGFlags,null) 下面进入androID.os包下的Process类中 start()方法会调用private static int startViaZygote()方法 startViaZygote()方法会调用private static int zygoteSendArgsAndGetPID()方法 zygoteSendArgsAndGetPID()方法会使用socket与zygote进程通信 sZygoteSocket = new LocalSocket(); sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET,LocalSocketAddress.namespace.RESERVED)); 下面进入com.androID.internal.os包下的ZygoteInit类 ZygoteInit类里面含有LocalSocketServer的实例,会与上面提到的zygoteSendArgsAndGetPID()方法使用socket进行通信 实际逻辑在ZygoteConnection这个类中的boolean runOnce()方法中 runOnce()方法会调用dalvik.system.Zygote这个类中的静态方法forkAndSpecialize() 下面进入dalvik.system包中的Zygote类 forkAndSpecialize()最终调用了native的方法native public static int forkAndSpecialize() 在c代码中开启应用程序的进程 应用的进程从androID.app包下的ActivityThread类开始运行 ActivityThread类中含有main()方法 ActivityThread.main()是应用的启动入口,在应用程序启动的时候就会调用app的启动优化:
基于上面的启动流程我们尽量做到如下几点
Application的创建过程中尽量少的进行耗时 *** 作 如果用到SharePreference,尽量在异步线程中 *** 作 减少布局的层次,并且生命周期回调的方法中尽量减少耗时的 *** 作通过此文,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android APP启动方式、启动流程及启动优化分析全部内容,希望文章能够帮你解决Android APP启动方式、启动流程及启动优化分析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)