-
冷启动
2017-09-18 14:08:34简介冷启动指用户在手机桌面点击APP图标那刻起到启动页面Activity调用onCreate()方法时间段。打开一个Activity时,若该Activity所属Application没启动,则系统会为该Activity创建一个进程(每创建一个进程会调用一次...介绍
冷启动指用户点APP图标至启动页调onCreate()方法阶段。
打开一Activity,若该Activity所属Application没启动,则系统为该Activity创建一进程(即zygote进程首先创建一新进程运行APP)。每创建一进程调一次Application,故Application之onCreate()方法可能被调多次。进程创建和初始化势必消耗时间,该阶段内WindowManager先加载APP主题样式中窗口背景
windowBackground
作为预览元素,即Preview Window(预览窗口),然后加载真正布局。该时间过长且默认背景黑或白色便给用户造成错觉,APP卡顿不流畅,影响用户体验。思路
点APP图标后所见黑或白屏是界面渲染前第一帧,故对Theme中
windowBackground
设置即可。方案一
窗口背景Logo
<!--窗口背景--> <item name="android:windowBackground">@drawable/splash_page</item>
方案二
窗口背景透明,用户点APP图标后不立即进入APP而桌面停留片刻。其实此时APP已启动,只是Theme中
windowBackground
透明。<!--窗口背景--> <item name="android:windowBackground">@color/transparent</item> <!--窗口透明--> <item name="android:windowIsTranslucent">true</item>
方案三
禁止加载Preview Window
<item name="android:windowDisablePreview">true</item>
方案四
窗口背景设能解析出图片资源的XML文件
drawable
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque"> <item> <!--android:gravity="center"仅显图中部分--> <bitmap android:gravity="fill" android:src="@drawable/splash" /> </item> </layer-list>
styles
<resources> <!-- Base Application Theme --> <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <!--去除ActionBar--> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <!--标题栏颜色--> <item name="colorPrimary">@color/colorPrimary</item> <!--状态栏颜色 5.0+有效--> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <!--控件选中颜色--> <item name="colorAccent">@color/colorPrimaryDark</item> <!--窗口背景--> <!--<item name="android:windowBackground">@drawable/preview_window</item>--> <!--窗口透明--> <!--<item name="android:windowIsTranslucent">true</item>--> <!--页面切换动画--> <item name="android:windowAnimationStyle">@style/AnimationActivity</item> <!--取消字体默认大写--> <item name="android:textAllCaps">false</item> <!--更改系统状态栏字体颜色 6.0+--> <!--<item name="android:windowLightStatusBar">true</item>--> <item name="android:windowDisablePreview">true</item> </style> <style name="AppTheme" parent="AppBaseTheme"></style> <style name="AnimationActivity" parent="@android:style/Animation.Activity"> <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item> <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item> <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item> </style> <style name="Theme.Splash" parent="AppTheme"> <item name="android:windowBackground">@drawable/preview_window</item> <item name="android:windowFullscreen">true</item> </style>
清单文件
<activity android:name=".SplashActivity" android:theme="@style/Theme.Splash"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background" android:orientation="vertical"> <ImageView android:id="@+id/ivBack" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" /> <ImageView android:id="@+id/ivTarget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/splash_icon" /> </RelativeLayout>
主代码
package com.self.zsp.rd; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Intent; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.WindowManager; import android.view.animation.AccelerateInterpolator; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.ViewPropertyAnimation; import base.BaseActivity; /** * @decs: 闪屏 * @date: 2017/11/6 17:16 * @version: v 1.0 */ public class SplashActivity extends BaseActivity { /** * 控件 */ private ImageView imgBack; private ImageView ivTarget; /** * 属性动画 */ ViewPropertyAnimation.Animator animator = new ViewPropertyAnimation.Animator() { @Override public void animate(View view) { view.setAlpha(0f); ObjectAnimator objAnimator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f); objAnimator.setDuration(2000); objAnimator.start(); } }; @Override protected void initContentView() { // 处理PreviewWindow背景图,避免图片一直占用内存,过渡绘制 getWindow().setBackgroundDrawable(null); // 初始化状态栏 initStatus(); setContentView(R.layout.activity_splash); } @Override protected void stepUI() { imgBack = findViewById(R.id.ivBack); ivTarget = findViewById(R.id.ivTarget); } @Override protected void initConfiguration() { } @Override protected void initData() { } @Override protected void startLogic() { ivTarget.post(new Runnable() { @Override public void run() { Glide.with(SplashActivity.this).load(R.drawable.splash).animate(animator).into(imgBack); startAnimation(); } }); } @Override protected void setListener() { } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); } /** * 初始化状态栏 */ private void initStatus() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { View decoderView = getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decoderView.setSystemUiVisibility(option); getWindow().setStatusBarColor(Color.TRANSPARENT); } else { WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes(); localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); } } /** * 动画执行 */ private void startAnimation() { int imgHeight = ivTarget.getHeight() / 5; int height = getWindowManager().getDefaultDisplay().getHeight(); int dy = (height - imgHeight) / 2; AnimatorSet set = new AnimatorSet(); ObjectAnimator animatorTranslate = ObjectAnimator.ofFloat(ivTarget, "translationY", 0, dy); ObjectAnimator animatorScaleX = ObjectAnimator.ofFloat(ivTarget, "ScaleX", 1f, 0.2f); ObjectAnimator animatorScaleY = ObjectAnimator.ofFloat(ivTarget, "ScaleY", 1f, 0.2f); ObjectAnimator animatorAlpha = ObjectAnimator.ofFloat(ivTarget, "alpha", 1f, 0.5f); set.play(animatorTranslate).with(animatorScaleX).with(animatorScaleY).with(animatorAlpha); set.setDuration(1200); set.setInterpolator(new AccelerateInterpolator()); set.start(); set.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { ivTarget.postDelayed(new Runnable() { @Override public void run() { startActivity(new Intent(SplashActivity.this, LoginActivity.class)); SplashActivity.this.finish(); } }, 3000); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } }
优化
如上方法可实现APP秒开效果但非真实速度。Activity创建过程会经一系列Framework层操作,日常开发会重写Application类,然后在Application进行一些初始化操作,比如存放用户标识的静态化TOKEN、第三方SDK初始化等。
- 尽量不让Application参与业务逻辑操作
- 尽量不在Application中进行耗时操作。比如查询一系列文件夹或文件,这些I/O操作应在必要使用时创建或利用数据库操作。
- 尽量不以静态变量方式在Application保存数据等。
- 尽量减少布局复杂性、布局深度,最好不超三层嵌套。因在View绘制过程中测量相当耗费性能。
注意
预览窗口全屏则
android:windowBackground
与android:windowFullscreen
结合使用,即剥离并设给SplashActivity。如下:<style name="Theme.Splash" parent="AppTheme"> <item name="android:windowBackground">@drawable/preview_window</item> <item name="android:windowFullscreen">true</item> </style>
<activity android:name=".SplashActivity" android:theme="@style/Theme.Splash"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Preview Window背景图不做处理会致图一直存于内存并过渡绘制,故进入欢迎页时需把背景图置空或将主题重置默认。如下:
getWindow().setBackgroundDrawable(null);
setTheme(R.style.AppTheme);
参考
-
补丁冷启动模式_电脑冷启动热启动 启动方式介绍
2020-12-22 07:10:40电脑冷启动热启动启动方式介绍同我们日常使用的各种电器一样,计算机只有在接通电源以后才能工作。但由于计算机比我们日常使用的各种家用电器要复杂得多,因此,从机器接通电源到做好各种准备工作要经过各种测试及一...电脑冷启动热启动
启动方式介绍
同我们日常使用的各种电器一样,计算机只有在接通电源以后才能工作。但由于计算机比我们日常使用的
各种家用电器要复杂得多,
因此,
从机器接通电源到做好各种准备工作要经过各种测试及一系列的初始化,
这个过程被称为启动。一是冷启动。
冷启动是指机器尚未加电情况下的启动。
第一步:检查电源是否接好;
第二步:打开显示器、打印机、扫描仪等外部设备;
第三步:按下主机箱面板上的电源开关,接通主机电源。这时机器就开始启动,系统首先对内存自动测试,
屏幕左上角不停地显示已测试内存量。接着启动硬盘驱动器,机器自动显示提示信息,进入操作系统。
二是复位启动。该启动过程类似于冷启动。一般说来,为避免反复开关主机而影响机器工作寿命,在热启
动无效的情况下,可用复位启动方式。
启动方法是用手按一下主机箱面板上的复位按钮即可。
三是热启动。所谓热启动是指机器在已加电情况下的启动。通常是在机器运行中异常停机时使用。
在
DOS
下的操作方法是先用两手指按住“Ctrl”与“Alt”键不松开,再按下“Del”键,然后同时抬起三
个手指,机器便重新启动。如果用户正在
Windows
系统中操作,则按下“Ctrl+Alt+Del”组合键后,系统
会给出提示,询问是否确实要重新启动计算机。
如果确定,可再次按下
“Ctrl+Alt+Del”
键。热启动过程在以上介绍的几种启动方式中最为迅速,因为省去了
一些硬件测试及内存测试。但是,当某些严重错误使得热启动无效时,只有选用冷启动或复位启动。
-
PLC 冷启动、暖启动、热启动.rar
2019-09-17 23:51:48PLC 冷启动、暖启动、热启动rar,PLC 冷启动、暖启动、热启动 -
App 冷启动与热启动及启动白屏优化
2018-08-26 15:19:41博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主威威喵原创,请多支持与指教。 ... 介绍一下 app 冷启动和热启动方式来实现 app 秒开的效果... 冷启动:指 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 的一张图,而不是白茫茫的背景了,看起来舒服了许多。
-
Android冷启动&热启动,冷启动优化
2018-11-12 14:10:301:冷启动,热启动 1.1:冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。 特点:系统会重新创建一个新的进程分配给它,所以会先创建和初始化...1:冷启动,热启动
1.1:冷启动
当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
特点:系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化设置的MainActivity,最后显示在界面上。
1.2:热启动
当启动应用时,后台已有该应用的进程(例:按home键,应用会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),再次打开该应用时,这个方式叫热启动。
特点:会从已有的进程中来启动,所以热启动就不会重新创建一个新的进程和初始化Application了,所以热启动的过程只需要创建和初始化MainActivity就行了,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。2:冷启动优化
2.1:第一次启动的时间:
从应用启动,创建进程开始计算,到完成视图的第一次绘制(即Activiy内容对用户可见)为止。
中间会经历的过程有:
Application构造器–>attachBaseContext()–>OnCreate()
–>Activity构造器–>onCreate–>配置主题背景等属性
–>onStart()–>onResume–>显示在界面上可以交互。所以相应的优化方案也就从关键位置来开始了:
- 减少 onCreate方法的工作量。
- 不要让Application参与业务逻辑。
- 不要在Application中做耗时操作,一些初始化操作可以开启子线程来完成。
- 不要以静态变量方式在Application中保存数据。
- 布局优化/mainThread尽量延迟初始化。
6:启动画面的初始化可以使用设置主题背景的方式,速度回更快
2.2:Android App启动优化和黑白屏问题
Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法//学习记录
-
Android冷启动和热启动以及冷启动优化方案
2020-01-17 15:34:461、什么是冷启动和热启动 (1)、冷启动: 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动,也就是先实例化Application。 (2)、热启动: 当启动应用时... -
补丁冷启动模式_android 性能优化 -- 启动过程 冷启动 热启动
2020-12-22 07:10:37一、应用的启动方式通常来说,启动方式分为两种:冷启动和热启动。1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。2、热启动:当启动应用时... -
广告冷启动_社区产品如何冷启动?
2020-12-31 23:19:17编辑导读:冷启动——在社交产品内,用户建立有效关系并持续产生内容及互动前,产品所处的状态。本文作者结合相关冷启动的案例,对社区产品冷启动背后的运营策略和具体步骤展开了梳理分析,供大家参考学习。社区产品... -
s7300 ,400冷启动、暖启动、热启动介绍.docx
2019-09-15 04:36:37s7300 ,400冷启动、暖启动、热启动介绍docx,s7300 ,400冷启动、暖启动、热启动介绍 -
冷启动与热启动
2019-09-27 04:37:51冷启动:启动应用时,后台没有该应用的进程,系统会重新创建一个新的进程分配给该应用,即冷启动; 热启动:启动应用时,后台已有该应用的进程(例如:点击Back键或Home键退出,此时应用的进程依然在后台存活),... -
浅谈android性能优化之启动过程(冷启动和热启动)
2021-01-04 13:27:57本文介绍了浅谈android性能优化之启动过程(冷启动和热启动) ,分享给大家,具体如下: 一、应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动。 1、冷启动:当启动应用时,后台没有该应用的进程,这时系统... -
冷启动和热启动
2019-11-26 09:48:42冷启动是指在计算机关机状态下按机箱上POWER按钮启动。也就是切断电脑的电源,重新启动,一旦冷启动,内存的东西全部丢失,重新检测硬件,进入CMOS,再依启动操作系统。 热启动是指在电脑已经加电的情况下,同时按... -
补丁冷启动模式_开启汽车冷启动模式
2021-01-16 05:57:57#汽车每天都要冷启动,可以磨损多久#爱车避免维修,延长发动机寿命,相信是所有车主的心声。这个目标可以实现吗?如何实现这个目标,那就要从日常正确保养开始。“汽车冷启动”无疑是发动机磨损最严重的模式,数据... -
冷启动问题
2020-09-14 22:51:07冷启动问题简而言之就是对于很多纯粹做推荐系统的网站或者在开始阶段就希望有个性化推荐的网站,如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意的问题,就是冷启动问题。 一般冷启动... -
懂点运营-冷启动
2021-03-09 21:30:52冷启动