当前位置: 移动技术网 > IT编程>移动开发>Android > Android APP启动方式、启动流程及启动优化分析

Android APP启动方式、启动流程及启动优化分析

2019年07月24日  | 移动技术网IT编程  | 我要评论

婴儿游泳池哪种好,文虎考堂,圣道霸强

本文章向大家介绍android app应用启动的一些相关知识,包括app启动方式、app启动流程和app启动优化等知识!

 app应用启动方式

1、冷启动

 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化application类,再创建和初始化mainactivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

2、热启动

当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走application这步了,而是直接走mainactivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个mainactivity就行了,而不必创建和初始化application,因为一个应用从新进程的创建到进程的销毁,application只会初始化一次。

 app应用启动流程

为方便排版,去掉部分方法中的参数:

  1. 从activity类的startactivity()方法开始,这个方法会调用activity类中的public void startactivityforresult()方法
  2. startactivityforresult()方法会调用instrumentation类中的public activityresult execstartactivity()方法,这个方法加上了{@hide}对外是不可见的
  3. execstartactivity()方法中有如下的调用语句activitymanagernative.getdefault().startactivity(),它调用了iactivitymanager类中的startactivity()方法
  4. 但iactivitymanager其实只是一个接口,这里实际调用的是public abstract classactivitymanagernative这个类(它继承自binder类)的内部类activitymanagerproxy中的public int startactivity()方法,activitymanagerproxy实现了iactivitymanager接口
  5. 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")实例化
  6. mremote.transact(start_activity_transaction, data, reply, 0)这条语句通过ibinder的transact()方法,将方法中的参数跨进程传递给activitymanagerservice类
  7. 以上除activitymanagerservice类之外的类都位于android.app包下
  8. 下面进入activitymanagerservice类,它位于源码的/frameworks/base/services/java/com/android/server/am/路径下,包名是com.android.server.am
  9. activitymanagerservice继承了activitymanagernative类,从activitymanagerproxy类的mremote.transact()传递过来的参数,被传递到activitymanagerservice类的ontransact()方法来处理
  10. activitymanagerservice类的ontransact()方法实际上通过super.ontransact(code, data, reply, flags)这条语句又调用了activitymanagernative类中的ontransact()方法
  11. super.ontransact(code, data, reply, flags)这条语句会调用到activitymanagerservice类的public final int startactivity()方法
  12. activitymanagerservice类的startactivity()方法会调用到activitystack类的startactivitymaywait()方法
  13. activitystack类位于com.android.server.am包下,startactivitymaywait()方法final int startactivitylocked()方法
  14. startactivitylocked()方法最后会调用final boolean resumetopactivitylocked()方法
  15. resumetopactivitylocked()方法会调用private final void startspecificactivitylocked()方法
  16. startspecificactivitylocked()方法会调用startprocesslocked()方法
  17. startprocesslocked()方法会调用android.os.process类的public static final int start()方法
  18. int pid = process.start("android.app.activitythread", msimpleprocessmanagement ? app.processname : null, uid, uid, gids, debugflags, null)
  19. 下面进入android.os包下的process类中
  20. start()方法会调用private static int startviazygote()方法
  21. startviazygote()方法会调用private static int zygotesendargsandgetpid()方法
  22. zygotesendargsandgetpid()方法会使用socket与zygote进程通信
  23. szygotesocket = new localsocket();
  24. szygotesocket.connect(new localsocketaddress(zygote_socket, localsocketaddress.namespace.reserved));
  25. 下面进入com.android.internal.os包下的zygoteinit类
  26. zygoteinit类里面含有localsocketserver的实例,会与上面提到的zygotesendargsandgetpid()方法使用socket进行通信
  27. 实际逻辑在zygoteconnection这个类中的boolean runonce()方法中
  28. runonce()方法会调用dalvik.system.zygote这个类中的静态方法forkandspecialize()
  29. 下面进入dalvik.system包中的zygote类
  30. forkandspecialize()最终调用了native的方法native public static int forkandspecialize()
  31. 在c代码中开启应用程序的进程
  32. 应用的进程从android.app包下的activitythread类开始运行
  33. activitythread类中含有main()方法
  34. activitythread.main()是应用的启动入口,在应用程序启动的时候就会调用

 app的启动优化:

基于上面的启动流程我们尽量做到如下几点

  1. application的创建过程中尽量少的进行耗时操作
  2. 如果用到sharepreference,尽量在异步线程中操作
  3. 减少布局的层次,并且生命周期回调的方法中尽量减少耗时的操作

通过此文,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网