Android App启动及黑白屏

App启动流程,黑白屏原因

APP启动流程详解

开机启动流程


开机启动流程

当用户将安卓手机开机以后,手机内部会有一个引导芯片,这个引导芯片会去一个只能读取的存储器中将一个叫做BootLoader的引导程序,加载进主存空间,这个主存它是我们这个cpu直接交换数据的一个内部存储器。手机开启后,它并不会说直接去启动Android系统,而是需要通过这个小程序,它就是为了将我们的整个系统拉起来而运行,Android是基于这个Linux内核的,当它在启动这个程序的运行的时候,先是要进行这个Linux的这个启动,Linux启动的时候,它会先设置缓存加载驱动,当这个内核完成设置之后,它就会从这个系统文件中去寻找一个叫做init.rc文件,并且启动一个叫做init的进程,这个进程的id为1,那么init进程在启动之后,它也会去启动Zygote这样一个进程,然后Zygote会帮我们去启动JVM虚拟机,注册JNI的方法,启动SystemServer等一些其他的进程;在Android系统里概念比较熟悉的,如Binder线程池,SystemServiceManager,ActivityManagerService等一些其他的服务都是有SystemServer进行启动的;启动这些服务里面,ActivityManagerServer又会帮我们启动一个Launcher,Luanch也是一个App,打开手机看到的就是Luanch应用,它会将我们这个系统中安装的时候这些应用的一些快捷键的信息,类似于这个快捷的信息,全部都放到这个屏幕上面来,那么当我们点击这个上面的某个App的按钮,才会进入这个App的启动流程。

冷/热/暖启动

•冷启动:程序从头开始,系统没有为该程序创建进程。一般场景:程序安装后的第一次启动;应用程序被系统完全终止后再打开;

冷启动流程:1、加载并启动App;2、启动后立即为改App显示一个空白的启动窗口;3、创建App进程;4、创建主Activity;5、加载布局,绘制

•热启动:此时程序仍然驻留在内存中,只是被系统从后台带到前台,因此程序可以避免重复对象初始化,加载布局和渲染。需要注意的是,如果程序的某些内存被系统清除,比如调用了onTrimMemory方法,则需要重新创建这些对象以响应热启动事件。

•暖启动:它包含热启动和冷启动一系列的操作子集,比热启动的消耗稍微多一点。它与热启动最大区别在于,它必须通过调用onCreate方法开始重新创建活动,也可以从传递给onCreate方法中保存的实例状态中获得某些对象的恢复。

App启动总结

App从被系统调用,再到第一个页面渲染到手机屏幕。我们通常只需要关注Application中的onCreate方法,第一个Activity中onCreate, onStart, onResume方法。

注意:如果在App启动第一个Activity时,该Activity不但有自己的逻辑,还在onCreate,onStart或者onResume方法中直接又跳转到了其他Activity页面,那么跳转后的Activity的这三个方法也需要进行优化。


黑白屏原因

黑白屏原因:在App的启动流程中,我们已知:当系统加载并启动App时,需要耗费相应的时间,即使时间不到1秒,用户也会感觉到当点击App图标时会有“延迟”现象,为了解决这问题,Google的做法是在App创建的过程中,先展示一个空白页面,让用户体会到点击图标之后立马就有响应而这个空白页面的颜色则是根据我们在Manifest文件中配置的主题背景颜色来决定的;现在一般默认是白色(android:theme=@style/AppTheme”);

解决黑白屏以及App启动优化

解决方案一:修改AppTheme

在应用默认的AppTheme中,设置系统“取消预览(空白窗体)”为true,或者设置空白窗体为透明,具体代码如下所示;

```

«style name= "AppTheme"

parent= "Theme.AppCompat.Light.DarkActionBar"

<! -- Customize your theme here.-->

<item name= "colorPrimary">@color/colorPrimary</item>

<item name= "colorPrimaryDark"</item> <!--@color/colorPrimaryDark-->

<item name= "colorAccent">@color/colorAccent</item>

<!--设置系统取消预览(空白窗口)为true ->

<item name="android:windowDisablePreview">true</item>

<!--设置背景透明 ->

<item name="android:windowIsTranslucent">true</item>

</style>

```

该两种方式都属于同一种方案:将Theme的背景改为透明,这样用户从视觉上就无法看出黑白屏的存在。

解决方案二:自定义AppTheme

自定义集成自AppTheme的主题;将启动的Activity的Theme设置为自定义的主题;在启动Activity的onCreate方法中,在super.onCreate和setContentView方法之前调用setTheme方法,将主题设置为最初的AppTheme


黑白屏解决总结:

自动以Theme,单独设置给启动页Activity;

使用layer-list,代替theme中的背景图片

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

  • 大家都遇到过自己 app 启动时间有些长,屏幕白屏的问题吧。一个正常的商业 app 在启动时时会加载一大票组件的初...
    前行的乌龟阅读 8,803评论 0 14
  • App启动分为冷启动和热启动 冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应...
    wenou阅读 2,744评论 2 1
  • 启动状态 应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动、温启动与热启动。在冷启动中,应用从...
    闫回阅读 4,464评论 0 6
  • 技术点: 1、传说中的黑白屏问题优化 2、黑白屏在商业App中的价值 3、App启动流程 4、如何使用Tracev...
    Dear月阅读 2,405评论 0 0
  • 系统启动 1、打开电源 引导芯片代码加载引导程序BootLoader到RAM中执行2、BootLoader把操作系...
    放肆滴微笑阅读 936评论 0 0