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


一、启动流程

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有关不能放入子线程的,把资源拆分,业务流程优化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值