文章目录
一、启动流程
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进程(创建应用程序对象)
-
启动主线程,创建主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有关不能放入子线程的,把资源拆分,业务流程优化