App 冷启动与热启动及启动白屏优化

介绍一下 app 冷启动和热启动方式来实现 app 秒开的效果。那么,先来看看什么叫冷启动和热启动。

冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动。

热启动:指 app 没有被后台杀死,仍然在后台运行,通常我们再次去打开这个 app,这种启动方式叫热启动。

那么,何为闪屏页呢?这个大家一般都知道,我们 app 也非常常见的。比如微信、QQ 等等应用,你将这些应用清除掉它们的后台运行的情况下,再去打开。这时候会出现一个闪屏页,类似我们的背景页。这个页面停留的时间非常短,一般不会超过 3秒,太久了就会使用户感觉这个 app 好卡的样子。

然后,我们看新建的一个项目,不做任何操作运行时会发现它在启动之时会有一个白屏的时间。那么,大部分 app 的解决方式就是我上面提到的闪屏页来替换白屏页。其实,也就是替换默认的 activity 的 theme。我们看看白屏的效果(其实在我点下的瞬间,已经是白屏了。模拟器也许屏蔽了,在手机上非常直观)

白屏效果

为什么替换?这就是提升我们的用户体验了,可以发现我们白屏页显得非常的难看,而且用户可能会误以为这是app卡的结果造成的。如果我们换成了闪屏页,不仅可以为app添加属于自己的脸面,也可以造成一种app秒开的假象。用户发现app已经被打开了,为何迟迟不进去,那可能是觉得手机不够给力啊,哈哈。

实现步骤

我们提到秒开app,不管它是一种假象也罢,既然市面上大部分的app都是这么处理的,不妨我们也学习一下。

一、设置 style 主题

首先,我们为闪屏页设置它的style,通常它是隐藏标题栏、隐藏状态栏、全屏的,然后用一张突显app主题的背景图片来填充整个屏幕。那么,我们这样设置它:

<!--闪屏页-->
 <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
 <item name="android:windowBackground">@drawable/bg_splash_theme_leader</item>
 <item name="android:windowNoTitle">true</item>
 <item name="android:windowFullscreen">true</item>
 </style>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item>
 <bitmap
 android:gravity="fill"
 android:src="@drawable/splash" />
 </item>
</layer-list>

二、绑定到 Activity 上

然后,将这一主题运用到我们需要的activity上,比如我的SplashActivity:

<activity
 android:name=".SplashActivity"
 android:launchMode="singleTask"
 android:screenOrientation="portrait"
 android:theme="@style/SplashTheme">
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />

 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>

最后,运行项目,你就会体会到什么叫做冷启动秒开应用了。我们先前的白屏页面,最终变成了一张自己的图片,即显得美观,又达到了秒开的目的,真是一举两得!

分析

注意:我们的SplashActivity不做任何初始化和设置布局,在onCreate中直接开启我们的MainActivity就行了。否则,在SplashActivity中停留过多的时间,就会出现卡在闪屏页许久才进入,我们的秒开也就变了味。

再说说我们的热启动实现方式,通常我们按下back键时,activity的生命周期会执行onStop,onDestory ——> onCreate。造成我们试图被销毁了又得重新创建。但是,我们按下home键却是不一样的,activity的生命周期会执行onStop ——>onReStart,所以热启动就是以back键替换成了home键,其实app是被置到了后台,所以当你再次点击打开app时,它会马上的启动。

但是,这类app通常是用于后台处理比较重要的,比如QQ后台接收信息,音乐播放器后台播放,通常都是屏蔽了back键,或者会有一个back键防误触操作。当然,这就得我们自己的app的自身需求了,通常做法就是将back键改为home键操作。

 /**
 * App 热启动方式,实现应用程序秒开效果
 */
 @Override
 public void onBackPressed() {
 //直接返回桌面 ( Activity只执行onStop )
 if (isStartHome()) {
 Intent intent = new Intent("android.intent.action.MAIN");
 intent.addCategory("android.intent.category.HOME");
 startActivity(intent);
 } else {
 super.onBackPressed();//( Activity将执行onDestory )
 }
 }

一种优化启动的思路

这是我很久之前看到的一种思路,既然说到闪屏页,那就一并说明。它是利用EventBus,在application的创建时期不加载各种配置和各种库,而是先显示闪屏页。在闪屏页中,利用EventBus开启各种配置和库的加载(application中进行),等到这些库加载完毕后,再次利用EventBus发送事件进入主界面。

思路就是利用闪屏页的时间用于加载各种配置和库,而不是在application创建时就加载。我们看一下代码的实现方式

/**
 * @Created by xww.
 * @Creation time 2018/8/25.
 */

public abstract class WeatherAppclication extends Application {
 @Override
 public void onCreate() {
 super.onCreate();
 //在此,先不加载库
 EventBus.getDefault().register(this);
 }

 @Subscribe
 public void init(String event) {
 //在这里初始化一坨一坨的库
 if ("initConfigurations".equals(event)) {
 Weather.init(this)
 .withApiHost("http://")
 .withApiKey("6439e059e16")
 .configure();

 EventBus.getDefault().post("initSuccess");
 EventBus.getDefault().unregister(this);
 }
 }
}
/**
 * @Created by xww.
 * @Creation time 2018/8/25.
 */

public class SplashActivity extends AppCompatActivity {

 private static final String TAG = "SplashActivity";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 EventBus.getDefault().register(this);
 EventBus.getDefault().post("initConfigurations");
 }

 @Subscribe
 public void startMainActivity(String event) {
 if ("initSuccess".equals(event)) {
 //在这里加载所需库完成,进入主界面
 startActivity(new Intent(SplashActivity.this, WeatherActivity.class));
 finish();
 }
 }

 @Override
 protected void onDestroy() {
 super.onDestroy();
 EventBus.getDefault().unregister(this);
 }

 /**
 * 屏蔽了返回键,避免在闪屏页中退出app
 */
 @Override
 public void onBackPressed() {
 }
}

我们的Log也可以很好的说明它们的执行顺序,成功的印证我们的思路是正确的。

这样的话,我们可以在启动 splash 页面加载一下库,然后加载完成后,进入主页面,由于资源都初始化好了,自然用起来就快一点,效果图:

这里我们点击桌面图标时,一启动的就是我们的 splash 的一张图,而不是白茫茫的背景了,看起来舒服了许多。

都看到这里了,各位看官点个关注呗!



原文地址:https://www.cnblogs.com/Androidqin/p/11536106.html

时间: 2024-09-29 21:47:40

App 冷启动与热启动及启动白屏优化的相关文章

14-1 启动白屏问题解决与启动屏开发-1

点击flutter的app.在打开的时候有持续1到3秒的白屏 白屏 白屏后才会显示首页 flutter应用在启动的时候,首先会启动flutter SDK,然后会将flutter的代码加载到内存里面.然后完成渲染.在这个过程中,它是没有内容可以显示的,所以就只能显示这样的一个白屏 添加欢迎页 开源的插件. 前身是一个react native的插件 搜索 添加插件的依赖 配置安卓部分的代码 以为安卓的模式打开项目 在MainActivity.java这个项目里面. res下添加一个安卓资源文件. 在

[FMX] Android APP 启动黑屏优化补丁

使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 2016.01.16 Version: 1.0.0 QDAC官方群: 250530692 *************************************************** [安装方式] 双击Setup.bat安装补丁文件(安装时会作备份) 双击Uninstall.bat可以恢复. [

APP启动时白屏优化及multidex优化

参考 https://juejin.im/post/5d95f4a4f265da5b8f10714b https://blog.csdn.net/suyimin2010/article/details/80635579 https://www.cnblogs.com/whycxb/p/9312914.html 问题说明 当打开一个Activity时,如果这个Activity所属Application还没有在运行,系统会为这个Activity的创建一个进程(每开启一个进程都会有一个Applicat

android App启动白屏

app启动的时候在启动也显示之前会出现白屏或黑屏的情况. 主要是因为视图没有及时填充上造成的,解决方式如下: 在style中添加以下代码: <style name="SplashTheme" parent="AppTheme"> 1 <!--<item name="android:windowBackground">@drawable/first</item>-->//此行可以给window设置背景

Android开发之解决APP启动白屏或者黑屏闪现的问题

在做搜芽的过程中,发现那个外包人缘做的不行,因为启动的时候会停顿,然后白屏一会,联想到几个月前我在我的三僚企业通信软件里面拉起9K-Mail的时候也会黑屏,所以决定学习一下.解决一下.这不,万能的网络还是非常有用的. 在这里总结一下. (参考及转载:http://www.2cto.com/kf/201409/339293.html) 欢迎页启动的线程由于请求和处理的数据量过大而,导致欢迎页在出现之前界面上会有一个短暂的白色闪屏停留,当然白色闪屏的停留是因为 application 的主题样式an

解决android 启动白屏问题

Android 启动APP时黑屏白屏的三个解决方案 http://www.cnblogs.com/liqw/p/4263418.html android:windowSoftInputMode属性使用 http://www.blogjava.net/zhip/archive/2011/02/14/344258.html

android studio你可能忽视的细节——启动白屏?drawable和mipmap出现的意义?这里都有!!!

android studio用了很久了,也不知道各位小伙伴有没有还在用eclipse的,如果还有,楼主真心推荐转到android studio来吧,毕竟亲儿子,你会知道除了启动速度稍微慢些,你找不到一个亚于eclipse的地方,哦,你电脑还不能太烂~ 1)先来说说android studio 启动应用黑白屏的问题. 前不久升级了studio,更新到了2.1.1,发现了一个问题.在启动新项目的时候,app总会出现一段长时间的白屏或者黑屏,楼主一开始一直以为是楼主接的公司项目算法太耗时的原因,但是楼

记录下自己VUE项目用Hbuider打包后启动白屏问题

刚用VUE做项目,之前测试时vue创建的自身项目打包都是启动OK没问题.今天打包自己的时,启动一直白屏.折磨了好久,百度了一堆.终于找到了方法. 首先是在config/index.js里面 build: { // Template for index.html index: path.resolve(__dirname, '../dist/index.html'), // Paths assetsRoot: path.resolve(__dirname, '../dist'), assetsSu

React Native 首次加载白屏优化

RN首次加载都会有个白屏过程,一般都会有500ms+的白屏时间,原生页面开发同样的页面会能够快速显示而在RN页面中有个明显的等待过程,这个会影响用户体验. 1.使用过度页面 简单处理可以在白屏过程中加个过度页面,通过设置RCTRootView的loadingView添加默认的加载过程 /** * A view to display while the JavaScript is loading, so users aren't presented * with a blank screen. B