科技公司建设网站公司公司页面设计
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:33
当前位置: 首页 > news >正文
科技公司建设网站公司,公司页面设计,网站设计风格升级,WordPress的jquery一个应用的启动速度能够影响用户的首次体验#xff0c;启动速度较慢的应用可能会导致用户再次开启该应用的意图下降#xff0c;或者卸载放弃该应用。
在性能优化中存在启动时间 2-5-8 原则#xff1a;
当用户在 0-2s 之间得到响应时#xff0c;会感觉应用的响应很快…一个应用的启动速度能够影响用户的首次体验启动速度较慢的应用可能会导致用户再次开启该应用的意图下降或者卸载放弃该应用。
在性能优化中存在启动时间 2-5-8 原则
当用户在 0-2s 之间得到响应时会感觉应用的响应很快当用户在 2-5s 之间得到响应时会感觉应用的响应速度还可以当用户在 5-8s 之间得到响应时会感觉应用的响应速度很慢但是还可以接受而当用户在超过 8s 后仍然无法得到响应时会感觉应用糟透了或者认为应用已经失去响应
八秒定律是在互联网领域存在的一个定律即指用户访问一个网站时如果等待网页打开的时间超过了 8 秒就有超过 70% 的用户放弃等待。
1 启动分类
冷启动启动应用时后台没有该应用的进程这时系统会重新创建一个新的进程分配给该应用然后再根据启动的参数启动对应的进程组件这个启动方式就是冷启动热启动启动应用时后台已有该应用的进程例如按 back 键、home 键应用虽然会退出但是该应用的进程是依然会保留在后台可进入任务列表查看。所以在已有进程的情况下这种启动会从已有的进程中来启动对应的进程组件这个方式叫热启动
冷启动的详细流程可以简单分成三个步骤其中创建进程步骤是系统做的启动应用和绘制界面是应用做的
创建进程启动 APP - 显示一个空白的启动 Window - 创建应用进程启动应用创建 Application - 启动主线程UI 线程- 创建第一个 Activity绘制界面加载视图布局inflating - 计算视图在屏幕上的位置排版Laying out - 首帧视图绘制Draw
冷启动和热启动的特点如下
冷启动系统会重新创建一个新的进程分配给该应用从 Application 创建到 UI 绘制等相关流程都会执行一次热启动应用还在后台因此该启动方式不会重建 Application只会重新绘制 UI 等相关流程
不同的启动方式决定了应用 UI 对用户可见所需要花费的时间长短冷启动消耗的时间最长。 基于冷启动方式的优化工作也是最考验产品用户体验的地方。
以下是启动时间这个启动时间是从应用启动创建应用进程开始计算到完成视图的首帧绘制即 Activity 的内容对用户可见为止 或者使用指令adb shell am start -S -W [packageName]/[packageName.MainActivity]-S 表示重新启动应用-W 启动并输出相应的数据 查看启动时间 TotalTime应用启动时间包含创建进程 Application 初始化 首页 Activity 初始化到界面显示的时间WaitTime一般比 TotalTime 大一点包含系统影响的耗时。
或者是使用埋点的方式启动时埋点启动结束埋点二者的差值就是启动时间。我们能够接触到的最早的启动相关回调方法是 Application.attachBaseContext 方法在这个方法中获取启动时间在 Activity.onWindowFocusChanged 方法中获取结束时间此时View 已经完成了 measure、layout但是还没有 draw。
以下是三种方式对比 2 优化方案
2.1 启动窗口优化
启动窗口指的是应用启动时候的预览窗口。Android 默认有一个启动页用户点击桌面 APP 图标之后系统会立即显示这个启动窗口等 APP 主页加载好之后再显示主页面。
这个启动窗口是可以禁用的部分开发者会禁用系统默认的启动窗口自己定义。但是自定义的启动窗口需要的时间要比直接显示系统的启动窗口所花的时间要长这就会导致用户在使用的时候点击图标启动 APP 的时候有一定的延迟 表现在点击图标过了一段时间才进行窗口动画进入 APP我们要尽量避免这种情况。
不要禁止系统默认的启动窗口即不要在主题里面设置 android:windowDisablePreview 为 true自己定制启动窗口的内容时可以将启动窗口的背景设置成和闪屏页一样或者尽量使闪屏页面的主题和主页一致。 可以参考知乎、抖音的做法合并闪屏和主页面的 Activity微信的做法不过由于微信设置了 android:windowDisablePreview 且它在各个厂商的白名单里面一般不会被杀冷启动的机会比较少
白屏/黑屏问题
在开发过程中界面经常会出现黑屏/白屏的问题。出现这种情况的原因一方面是创建进程需要准备很多资源是一个耗时的操作另一方面是在 Application 中进行了过多的初始化操作。 进程创建完成之前新的 Activity 界面不会展示进程会短暂没反应这极大的降低用户体验。
Android 团队避免出现这种尴局面于是系统根据清单文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个黑白屏被称作 Preview Window即预览窗口。
预览窗口是可以禁用的
style nameAPPTheme parentandroid:style/Theme.Holo.NoActionBaritem nameandroid:windowDisablePreviewtrue/item
/style这样做可以解决部分场景的问题比如在 A 进程启动 B 进程中的 Activity但是在另外一个场景就有问题了在桌面 Launcher 点击应用出现短暂的假死现象。
还可以自定义预览窗口
style nameAPPTheme parentandroid:style/Theme.Holo.NoActionBaritem nameandroid:windowBackgrounddrawable/splash_icon/itemitem nameandroid:windowFullscreentrue/itemitem nameandroid:windowNoTitletrue/item
/style该解决方案很适合启动一个 APP 场景android:windowBackground 属性设置 Preview Window 的背景市面上大部分 APP 都是使用该属性设置启动页背景。但是该解决方案不适合在跨进程启动 Activity 场景了。
还可以设置预览窗口透明属性
style nameAPPTheme parentandroid:style/Theme.Holo.NoActionBaritem nameandroid:windowIsTranslucenttrue/itemitem nameandroid:windowBackgroundandroid:color/transparent/item item nameandroid:windowFullscreentrue/itemitem nameandroid:windowNoTitletrue/item
/style该解决方案适合跨进程启动 Activity 场景使用。当然这个解决方案也会引入其他问题就是android:windowIsTranslucent 引起 Activity 切换动画无效解决方案。为了追求极致不能解决一个问题引入一个新问题该问题的解决方案也有两种
代码动态设置 Activity 专场动画
overridePendingTransition(R.anim.anim_right_in,R.anim.anim_left_out); 给 Window 设置动画 style
style nameAPPTheme parentandroid:style/Theme.Holo.NoActionBaritem nameandroid:windowIsTranslucenttrue/itemitem nameandroid:windowBackgroundandroid:color/transparent/item item nameandroid:windowFullscreentrue/itemitem nameandroid:windowNoTitletrue/itemitem nameandroid:windowAnimationStylestyleAnimation.Activity.Translucent.Style//item
/style
style nameAnimation.Activity.Translucent.Style parentandroid:style/Animation.Translucent item nameandroid:windowEnterAnimationanim/base_slide_right_in/item item nameandroid:windowExitAnimationanim/base_slide_right_out/item
/style 如果白屏/黑屏的问题比较严重很有可能是 Application 中执行了过多的初始化操作应该重点从这个方向着手处理问题。
2.2 线程优化
线程优化主要是减少 CPU 调度带来的波动让启动时间更稳定。如果启动过程中有太多的线程一起启动会给 CPU 带来非常大的压力尤其是比较低端的机器。可以使用线程池控制线程数量
class Test {public static void main(String[] args) {ExecutorService pool Executors.newFixedThreadPool(2);Thread t1 new TestThread();Thread t2 new TestThread();Thread t3 new TestThread();Thread t4 new TestThread();Thread t5 new TestThread();pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.execute(t5);}
}class TestThread extends Thread {Overridepublic void run() {System.out.println(Thread.currentThread().getName() 正在执行…);}
}// pool-1-thread-1正在执行…
// pool-1-thread-2正在执行…
pool-1-thread-1正在执行…
pool-1-thread-2正在执行…
pool-1-thread-1正在执行…2.3 页面布局优化
2.3.1 减少层级嵌套尽量保持层级的扁平化
ConstraintLayout 可以按照比例约束控件位置和尺寸能够更好地适配屏幕大小不同的机型。 使用约束布局的关键点
约束布局采用相对定位原理即控件相对于另一个控件的约束一个控件至少三个方向的约束
constraint [kənˈstreɪnt] 限制束缚克制拘束
2.3.2 merge/
merge/标签用于降低 View 树的层次来优化布局。 可以适用于以下场景
顶层布局是 FrameLayout 且不需要设置 background 或 padding 等属性的可以用 merge 代替因为 Activity 内容视图的 Parent View 就是个 FrameLayout 可以用 merge 消除只剩一个
?xml version1.0 encodingutf-8?
merge xmlns:androidhttp://schemas.android.com/apk/res/androidTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text测试文字 //merge当布局作为子布局被其它布局 include/ 的时候使用 merge/ 当作该布局的顶层布局这样在被引入时顶层布局会自动被忽略而将其子布局会全部合并到主布局中
title_layout.xml
?xml version1.0 encodingutf-8?
merge xmlns:androidhttp://schemas.android.com/apk/res/androidTextViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text标题显示 //merge# activity_main.xml
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalinclude layoutlayout/title_layout / // 使用include标签引入merge标签布局TextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text内容显示 //LinearLayout2.3.3 ViewStub/
在开发中经常会遇到这样的情况会在程序运行时动态根据条件来决定显示某个 View 或某个布局。那么通常做法就是把用到的 View 都写在布局中然后在代码中动态的更改它是否可见。这样的做法在创建布局的时候也会创建 View。这时就可以用到 ViewStub/ 了它同 include/ 标签一样可以用来引入一个布局 ViewStub/ 是一个轻量级的 View不占布局位置占用资源非常小。
比如请求网络加载列表如果网络异常或者加载失败可以显示一个提示 View在上面可以点击重新加载。如果一直没有错误就不显示。
布局文件
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityViewStubandroid:idid/mViewStubandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:layoutlayout/title_layout / // 这里需要引入一个懒加载的布局/androidx.constraintlayout.widget.ConstraintLayout使用
public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewStub mViewStub findViewById(R.id.mViewStub);mViewStub.inflate(); // 需要显示时调用该方法}
}2.4 闲时调用
IdleHandler主要针对一些优先级不是很高的任务在 CPU 空闲的时候执行。 IdleHandler.queueIdle() 方法返回 true则会一直执行返回 false执行完一次后就会被移除消息队列。比如我们可以将一些打点任务或者把一些不重要的 View 的加载放到 IdleHandler 中执行。
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {Overridepublic boolean queueIdle() {return false;}
});2.5 CountDownLatch
线程之间可能存在相互等待依赖等相关问题一个或者多个线程等待另外 N 个线程完成某个事情之后才能执行。
CountDownLatch 是一个同步工具用来协调线程之间的同步用来作为线程间的通信而不是互斥作用能够使一个线程在等待另外一些线程完成各自的工作之后再继续执行。 使用一个计数器进行实现计数器的初始值就是线程的数量。当每个被计数的线程完成任务后计数器值减一当计数器的值为 0 时表示多有线程都已经完成了任务然后在 CountDownLatch 上等待的线程就可以恢复执行。 某一线程在开始运行前等待 n 个线程执行完毕。将 CountDownLatch 的计数器初始化为new CountDownLatch(n)每当一个任务线程执行完毕计数器减 1CountDownLatch.countDown()当计数器的值变为 0 时在 CountDownLatch.await() 的线程就会被唤醒。一个典型的应用场景就是启动一个服务时主线程需要等待多个组件加载完毕之后再继续执行。
public static void main(String[] args) {CountDownLatch latch new CountDownLatch(2);System.out.println(全班同学开始考试一共两个学生);new Thread(() - {System.out.println(第一个学生交卷countDownLatch 减 1);latch.countDown();}).start();new Thread(() - {System.out.println(第二个学生交卷countDownLatch 减 1);latch.countDown();}).start();try {latch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(老师清点试卷在此之前只要有一个学生没交countDownLatch 不为 0不能离开考场);
}// 全班同学开始考试一共两个学生
// 第一个学生交卷countDownLatch 减 1
// 第二个学生交卷countDownLatch 减 1
// 老师清点试卷在此之前只要有一个学生没交countDownLatch 不为 0不能离开考场2.6 CyclicBarrier循环屏障
CyclicBarrier循环屏障通过它可以实现让一组线程等待至某个状态之后再全部同时执行叫做循环是因为当所有等待线程执行完成以后CyclicBarrier 可以被重用。
2.7 系统调度优化
启动过程中除了 Activity 之外的组件启动要谨慎因为四大组件的启动都是在主线程的如果组件启动慢占用了 Message 通道也会影响应用的启动速度。
2.8 业务梳理
梳理清楚启动过程中的每一个功能哪些是一定需要的那些是可以砍掉那些是可以懒加载的。
懒加载当页面可见的时候才加载当前页面 没有打开的页面就不会预加载。 也就是说懒加载就是可见的时候才去请求数据。
3 TraceView 工具的使用
TraceView 是 Android Studio 配备的一个很好的性能分析工具它可以以图形化的方式展示执行时间、调用栈等信息并能具体到方法可以让我们了解更过的程序性能。
首先通过 Android SDK 自带的 Debug 方法对应用进行打点获取相关的信息
Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// 开始记录该方法可以设置文件大小和路径Debug.startMethodTracing(browser.trace);setSupportActionBar(binding.toolbar);NavController navController Navigation.findNavController(this, R.id.nav_host_fragment_content_main);appBarConfiguration new AppBarConfiguration.Builder(navController.getGraph()).build();NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);binding.fab.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Snackbar.make(view, Replace with your own action, Snackbar.LENGTH_LONG).setAction(Action, null).show();}});// 结束记录Debug.stopMethodTracing();}执行完以上操作后可以生成以下文件 /sdcard/Android/data/[packageName]/files/browser.trace。
导出文件通过 Android Studio 的 Profiler 打开 可以查看有多少线程、具体的方法耗时以及 CPU 的执行时间等信息。因为Traceview 收集的信息比较全面所以会导致运行开销严重影响 APP 的运行因此我们也无法区分是不是 TraceView 影响了我们的启动时间。
参考
[性能] adb shell am start -W 获取应用启动时间 Android冷启动耗时优化 Android App 启动优化全记录 Android性能优化系列启动优化 Android 性能优化—— 启动优化提升60% Android性能优化系列启动优化 安卓性能优化之启动优化 Android性能优化系列一启动优化 Android性能优化之布局优化使用约束布局 Android一些你需要知道的布局优化技巧 Android 跨进程启动Activity黑屏白屏的三种解决方案 CountDownLatch详解
- 上一篇: 科技公司php网站模版wordpress阿里秀模板
- 下一篇: 科技公司网站首页做电子简历的网站
相关文章
-
科技公司php网站模版wordpress阿里秀模板
科技公司php网站模版wordpress阿里秀模板
- 技术栈
- 2026年03月21日
-
科技粉末wordpress seo插件哪个好
科技粉末wordpress seo插件哪个好
- 技术栈
- 2026年03月21日
-
科技部网站做网站app怎么赚钱
科技部网站做网站app怎么赚钱
- 技术栈
- 2026年03月21日
-
科技公司网站首页做电子简历的网站
科技公司网站首页做电子简历的网站
- 技术栈
- 2026年03月21日
-
科技公司网站推荐qq可以做公司免费网站
科技公司网站推荐qq可以做公司免费网站
- 技术栈
- 2026年03月21日
-
科技公司主要经营什么深圳网站seo哪家快
科技公司主要经营什么深圳网站seo哪家快
- 技术栈
- 2026年03月21日
