启动概述
点击App图标时的启动分为冷启动和热启动
冷启动
后台不存在当前App的进程,系统创建一个新的进程分配给当前App,然后创建和初始化Application类,再创建和初始化MainActivity类(onCreate到onStart),到最后的显示。
热启动
当启动该App时,后台已存在该App的进程(例如:按back,home键退出activity,但是当前App的进程还在后台运行),这个时候不会创建Application类,而是直接创建MainActivity类并显示
启动耗时统计
启动App的耗时可以通过Logcat来查看,过滤ActivityManager和Displayed关键字
adb命令统计:adb shell am start -S -W 包名/MainActivity的完整包名
C:\Users\Administrator>adb shell am start -S -W com.example.testapp/com.example.testapp.MainActivity
Stopping: com.example.testapp
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.testapp/.MainActivity }
Status: ok
Activity: com.example.testapp/.MainActivity
ThisTime: 2237
TotalTime: 2237
WaitTime: 2522
Complete
冷启动Application
Application onCreate耗时解决
1.线程
public class TestApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
}
}
2.后台服务IntentService
public class TestApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
InitializeService.start(this);
}
}
public class InitializeService extends IntentService {
public static final String ACTION_INIT_APP_CREATE = "com.example.testapp.init";
public static void start(Context context) {
Intent intent = new Intent(context, InitializeService.class);
intent.setAction(ACTION_INIT_APP_CREATE);
context.startService(intent);
}
public InitializeService(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (null != intent && ACTION_INIT_APP_CREATE.equals(intent.getAction())) {
//加载第三方库,或者初始化
}
}
}
视觉优化(界面预加载)
当系统加载一个Activity的时候,onCreate()是一个耗时的过程,这时候系统为了让用户能有一个好的体验,实际上会先绘制一个初始界面,系统会首先读取当前Activity的Theme进行绘制,当Activity加载完,才会替换为Activity的实际布局,Theme中的布局可以通过android:windowBackground属性进行配置.
在AndroidManifest.xml中activity增加StartStyle配置
<activity android:name=".MainActivity" android:theme="@style/StartStyle">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在styles.xml中增加StartStyle
<style name="StartStyle" parent="AppTheme">
<item name="android:windowBackground">@drawable/start_window</item>
</style>
在drawable中增加start_window
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@mipmap/ic_start" />
</item>
</layer-list>
在MainActivity中的onCreate中的“super.onCreate(savedInstanceState);”之前设置Theme
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.StartStyle);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
最终效果
相比之前的白屏,现在的效果要好多了。