Android优化之启动优化和黑白屏优化

Android 启动优化说明、黑白屏处理(1) 前言正文在Android App使用过程中,对于应用的优化是一个加分项,举个例子,打开你的App需要2秒,人家0.5秒,这就是很大的用户体验上的优化。当然了目前我没见过有启动的这么快的App,因为什么呢?因为App在启动的时候做的事情太多了,这是对于那些商业的App来说,自己的App可以这么高,提升使用,首先我们来想一下启动优化。一、启动来历这个启动优化最开始并不是用在App上的,是在网页上的,在零几年的时候,那时候的电脑还是那种大而笨重的电脑。 阅读详情


一、启动流程

1.开机启动流程

开机—>BootLoader(引导芯片)—>Linux(init,rc)—>init进程(id=1)—> zygote进程—>JVM,SystemServer等—>ActivityManagerService,SystemServerManager,Binder(线程池)—>launcher(app)

2.app启动流程

  • ActivityThread:main()函数,相当于一个Handler,主线程,UI线程
  • ApplicationThread:与AMS沟通桥梁
  • mInstrumentation:通过这个api启动app,用来跟踪Activity和Application生命周期的类
  • AMS:数据管理者

ActivityThread通过ApplicationThread去AMS中获取Application的一些信息,在mInstrumentation中通过反射来创建app,调用app.onCreate()启动app

app启动流程


二、启动分类

  • 冷启动

    • 加载并启动app

    • 启动后立即为该app显示一个空白窗口(白屏)

    • 创建App进程(创建应用程序对象)

    • 启动主线程,创建主Activity

    • 加载布局,绘制(替换白屏)

  • 热启动

    • 应用中所有Activity都还驻留在内存中,则无需重复对象初始化,将Activity带到前台即可
  • 温启动


三、黑白屏优化

黑白屏优化主要体现在视觉上的优化,通常我们会加一个启动页来填充我们启动的时间

1.写一个xml文件(activity_welcome)

主要有一个启动的background和一个右上角的跳过按钮

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/bg_welcome">

    <TextView
        android:id="@+id/skip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:layout_marginEnd="10dp"
        android:background="@drawable/bg_skip_tw"
        android:clickable="true"
        android:focusable="true"
        android:gravity="center"
        android:paddingLeft="12dp"
        android:paddingTop="7dp"
        android:paddingRight="12dp"
        android:paddingBottom="7dp"
        android:text="@string/ship_3s"
        android:textColor="@color/blue"
        android:textSize="14sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

2.welcomeActivity类

class WelcomeActivity : BaseActivity() {

    private val GO_HOME = 0 //去主页

    private val GO_LOGIN = 1 //去登录页


    var thread: timeThread? = null

//    val MSG = 1
    val handler = @SuppressLint("HandlerLeak")
    object : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                GO_LOGIN -> {
                    skip.setText("跳过 " + msg.arg1)
                    if (msg.arg1 <= 0) {
                        val intent = Intent(this@WelcomeActivity, LoginWechatActivity::class.java)
                        startActivity(intent)
                        finish()
                    }
                }
                GO_HOME -> {
                    skip.setText("跳过 " + msg.arg1)
                    if (msg.arg1 <= 0) {
                        val intent = Intent(this@WelcomeActivity, MainActivity::class.java)
                        startActivity(intent)
                        finish()
                    }
                }
            }
        }
    }

    // 自定义的线程---控制倒计时
    inner class timeThread : Thread() {
        override fun run() {
            var i = 3
            while (i >= 0) {
                var msg = Message()
//                msg.what = MSG

                if(TelManage.hasTel()){
                    Log.d("1111111111",TelManage.getTel().toString())
                    msg.what = GO_HOME
                }else{
                    msg.what = GO_LOGIN
                }

                msg.arg1 = i
                handler.sendMessage(msg)
                i--
                try {
                    sleep(1000)
                } catch (e: Exception) {
                     e.printStackTrace()
                    break
                }
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportActionBar?.hide()
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
        setContentView(R.layout.activity_welcome)

        if (thread == null) {
            thread = timeThread()
            thread?.start()
        }

        skip.setOnClickListener {
            if (thread != null) {
                thread?.interrupt()
                thread = null
            }

            val intent = Intent(this, LoginWechatActivity::class.java)
            startActivity(intent)
            finish()
        }
    }
}



四、启动优化

1.获取启动时间

获取启动时间1: Displayed com.mnstartopt/.SplashActivity: +955ms 通过系统获取启动时间;
adb命令获取启动时间2: adb shell am start -W com.mnstartopt/.WelcomeActivity

	参数:
     launch:COLD,WARM,HOT
     ThisTime: 925  代表最后一个Activity启动时间;
     TotalTime:925  代表所有Activity的启动时间;
     WaitTime: 977  所有时间:ams启动activity总耗时;

2.启动优化方向

  • 能延时启动就延时(懒加载,异步加载)
  • 与UI有关不能放入子线程的,把资源拆分,业务流程优化
安卓启动优化实战:彻底解决黑白屏与异步初始化问题 本文聚焦安卓应用启动优化,重点解决"黑白屏"现象和主线程阻塞问题。通过分析启动流程机制,提出三大实战策略:1)利用主题背景替换默认窗口;2)延迟加载复杂组件;3)采用Android12的SplashScreen API。核心解决方案是异步初始化技术,包括使用协程、WorkManager等工具将高开销任务移出主线程,配合依赖注入实现懒加载。文章提供代码示例和性能监测方法,并针对面试常见问题进行深度解析。 阅读详情

相关推荐

优化Android应用启动体验:黑白屏问题解决指南

当我们讨论Android应用启动画面,一个关键的组件是SplashActivity。它作为应用启动的第一个界面,承担着展示品牌形象和提高用户体验的双重任务。SplashActivity应该是一个短暂出现,快速引导用户进入主界面的过渡性活动。为了设计一个有效的SplashActivity,我们需要考虑以下几个基本要素:快速加载:用户期望快速见到启动画面,因此SplashActivity需要迅速显示。这通常意味着应该避免在此阶段执行复杂的初始化操作。简洁的UI。

weixin_29215509的博客 1222

Android应用启动时白屏或者黑屏处理办法

activity默认的主题中的android:windowBackground为白色或者黑色

Jason_Lee155的博客 6056

手把手教你离线部署bert-base-uncased模型(附完整文件清单)

本文提供了一份详尽的bert-base-uncased模型离线部署指南。针对严格内网或无网络环境,文章不仅列出了包括config.json、pytorch_model.bin在内的完整必需文件清单,还详细解释了每个文件的作用,并给出了使用snapshot_download工具或手动下载的两种文件获取方法。重点阐述了如何正确设置本地路径、编写健壮的加载代码,并通过多层次验证确保模型在离线环境下成功运行,有效解决了部署过程中常见的文件缺失和路径错误问题。

weixin_29034963的博客 320

解决Android应用启动时白色/黑色闪屏问题的有效方案

解决Android应用启动时白色/黑色闪屏问题的有效方案

weixin_51522235的博客 2672

深入理解命名实体识别(NER)

命名实体识别(NER,Named Entity Recognition)是自然语言处理(NLP)中的一项重要技术,用于从文本中识别出特定类型的实体,并将这些实体分类到预定义的类别中。实体通常包括人名、地名、组织名、日期、时间、数量、货币等。例如,在句子“Barack Obama was born in Hawaii in 1961”中,NER任务的目标是识别“Barack Obama”作为人名,“Hawaii”作为地名,以及“1961”作为日期。

AngelCryToo的专栏 4638

打通Creo与Matlab的桥梁:Simscape Multibody Link插件安装与配置全攻略

本文详细介绍了Simscape Multibody Link插件的安装与配置全流程,旨在帮助机械工程师和开发者打通Creo与Matlab/Simulink之间的桥梁,实现CAD模型到多体动力学仿真的高效转换。文章重点解析了版本兼容性、管理员权限、注册文件配置等关键步骤与常见故障排查方法,助力用户快速建立设计与仿真一体化工作流。

rrr55的博客 634

Android 启动优化说明、黑白屏处理

启动对于安装来说,有两种,一种就是Android系统的启动,一种就是App应用的启动。Android系统启动就是手机启动,整个过程就是手机开机到进入手机桌面,里面的流程是这样的:上电(开机)BootLoader (系统引导芯片唤起)Init进程 (ID为1)Zygote进程ART,SystemServer等系统服务Binder(线程池)SSM(系统消息)、AMS(启动App)、PMS(包管理)等各种系统服务Launcher(手机系统桌面)下面就是App的启动,这也是文章中主要说明的。

2301_79056696的博客 988

AD9361 RSSI配置实战:从寄存器到精准功率测量的避坑指南

本文详细解析了AD9361芯片的RSSI配置实战,从寄存器设置到精准功率测量的全流程避坑指南。通过优化模式选择、测量持续时间及高级参数配置,实现高精度信号强度测量,并分享实际项目中的校准流程与性能优化技巧,帮助工程师提升射频接收链路的测量精度。

weixin_38166557的博客 442

Android:黑白屏优化

这可能是刚入android的小老弟会遇到的app优化问题,即当点击app图标后会先出现一个空白页(当前多为纯白)随后进入我们的启动页,这个骚操作其实是谷歌为了给用户在点击app图标后迅速响应的良好用户体验设计的,因为一个App加载时或多或少会有一些初始化操作,而这个时间取决于手机性能。 那么我们怎么处理这种情况呢,毕竟一个小小的白屏闪过也足以要了一个资深强迫症患者的命,现在就开启拯救世界之旅!!!...

qq_27246079的博客 1002

[TC3XX]AURIX TC3XX系列之启动流程

本文介绍了微控制器(MCU)启动过程中固件(Firmware)和启动软件(SSW)的工作原理。MCU上电复位后,硬件完成初始化,BootROM中的固件开始执行,进行参数加载、模式选择等操作。SSW作为第一个执行的软件,负责时钟配置、安全检查、多核管理及启动模式选择,最终跳转至用户代码。启动模式包括内部Flash启动、Bootloader模式(通过ASC或CAN接口)和备用启动模式(ABM),具体由复位类型、引脚配置和UCB设置决定。文章特别指出英飞凌TC3xx系列芯片中固件不可修改,只能通过配置参数定制启动

redparrot2008的博客 1420

ctftools-all-in-one使用说明

OAEP (Optimal Asymmetric Encryption Padding) 是一种用于RSA加密的填充方案,目的是提高RSA加密的安全性。在CTF比赛中,如果模数N的两个因子比较接近,使用"费马分解(N)"可能会更快地得到结果;OAEP 是 RSA 的一种标准填充方式(在 PKCS#1 v2.0+ 中定义),因此这类题目本质上仍是 RSA 题,但。,导致你不能直接用常规的 RSA 解密公式 �=�� mod �m=cdmodN 得到有意义的明文。如果你在 CTF 中遇到 RSA 题,

2501_91682449的博客 1713

Android性能优化—— 黑白屏启动优化

我们在很多APP启动的时候都能看到一闪而过的黑屏或者白屏,在我们这些强迫症深度患者看来,确确实实是个很糟糕的体验。但是在我们打开QQ或者一些优化过的应用的时候却看不到所谓的黑屏或白屏。我们今天就来探讨下这个黑白屏启动优化

大帅在唱歌 699

C#上位机与西门子PLC全链路通信实战教程:数据采集+SQL存储+数据库报表查询+报警历史完整实现

在工业自动化领域,西门子PLC(S7-200Smart/1200/1500)凭借稳定的性能、强大的功能、完善的生态,稳居工业控制器的主流地位;而凭借开发效率高、界面美观、兼容性强、数据库操作便捷的优势,成为工业上位机开发的首选编程语言。二者的组合,是目前制造业、自动化产线、智能仓储、暖通自控等场景的绝对主流方案,也是工业上位机工程师必须吃透的核心技术栈。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1863

Android 启动优化说明、黑白屏处理,附架构师必备技术详解

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

2401_84149814的博客 1008

基于simulink的低通滤波器(Low-pass Filter, LPF)

摘要:本文详细介绍了如何在Simulink中搭建低通滤波器进行噪声抑制仿真。通过定义系统需求(50Hz信号+250Hz噪声)、添加信号源、设计6阶巴特沃斯低通滤波器(截止频率100Hz)、连接各模块并配置仿真参数,最终实现高频噪声的有效滤除。该教程包含从模型创建到结果分析的完整流程,为信号处理系统开发提供了基础框架,并可进一步扩展为自适应滤波等高级应用。所需MATLAB版本为R2023a及以上,需安装Simulink和DSPSystemToolbox。

amy_mhd的博客 1303

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android黑白屏优化及启动时间的优化

黑白屏优化 Android黑白屏即指的时在点击桌面图启动app到主页界面ui显示这段时间所出现的白屏或者黑屏现象,默认情况下均为白屏,只有当在Them主题中将<item name="android:windowBackground">@null</item>设置才会出现黑屏 对于黑白屏的优化始终是一个伪优化即将Them中的<item name="android:w...

qq_29247839的博客 497

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android应用启动黑白屏解决方案及启动时间优化

黑白屏解决方案,下面两种方案选其中一种 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark"...

weixin_34335458的博客 420

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android 黑白屏启动优化

第一步:自定义style <style name="AppTheme.LauncherTheme"> <item name="android:windowBackground">@drawable/launch_layout</item> <item name="android:windowFullscreen">true</item> <item name="android:windowN

zqd1984309864的博客 369
上一篇: svg图片实战:自定义view打造中国地图
下一篇: MVC,MVP和MVVM架构解析
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值