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

 更新时间:2016年09月26日 08:50:22   投稿:lqh  
这篇文章主要介绍了Android APP启动方式、启动流程及启动优化分析的相关资料,需要的朋友可以参考下

本文章向大家介绍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. 减少布局的层次,并且生命周期回调的方法中尽量减少耗时的操作

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

相关文章

  • Android编程实现加载等待ProgressDialog的方法

    Android编程实现加载等待ProgressDialog的方法

    这篇文章主要介绍了Android编程实现加载等待ProgressDialog的方法,实例分析了Android中加载等待类ProgressDialog的具体使用方法,需要的朋友可以参考下
    2015-12-12
  • Flutter开发之动态权限的使用

    Flutter开发之动态权限的使用

    众所周知,Android在6.0版本后将权限修改成了动态权限,而iOS则一直使用的是动态权限,所以在Flutter应用开发中如果涉及到一些危险权限,就需要进行动态申请,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-09-09
  • Android如何通过命令行操作Sqlite3数据库的方法

    Android如何通过命令行操作Sqlite3数据库的方法

    这篇文章主要介绍了Android如何通过命令行操作Sqlite3数据库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Android横竖屏幕切换小结

    Android横竖屏幕切换小结

    这篇文章主要介绍了Android横竖屏切换小结的相关资料,需要的朋友可以参考下
    2016-02-02
  • Android自定义TextBanner实现自动滚动

    Android自定义TextBanner实现自动滚动

    这篇文章主要为大家详细介绍了Android自定义TextBanner实现自动滚动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Android自定义View实现拖拽效果

    Android自定义View实现拖拽效果

    这篇文章主要为大家详细介绍了Android自定义View实现拖拽效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Android中ImageCropper矩形、圆形 裁剪框的实现方法

    Android中ImageCropper矩形、圆形 裁剪框的实现方法

    这篇文章主要给大家介绍了关于Android中ImageCropper矩形、圆形 裁剪框的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2018-07-07
  • Android拦截并获取WebView内部POST请求参数的实现方法

    Android拦截并获取WebView内部POST请求参数的实现方法

    这篇文章主要介绍了Android拦截并获取WebView内部POST请求参数 的实现方法,本文通过两种方案给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • android实现上滑屏幕隐藏底部菜单栏的示例

    android实现上滑屏幕隐藏底部菜单栏的示例

    这篇文章主要介绍了android实现上滑屏幕隐藏底部菜单栏的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Android运用BroadcastReceiver实现强制下线

    Android运用BroadcastReceiver实现强制下线

    本篇文章主要介绍了Android运用BroadcastReceiver实现强制下线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07

最新评论