Android中APP的启动方式有两种状态,主要分为冷启动和热启动。
冷启动
启动APP时,应用的进程不在后台,系统会创建一个新的进程供APP使用。
冷启动在创建新的进程时,先会创建和初始化Application对象,再创建和初始化第一个Activity。其中包括一系列的测量、布局和绘制。
热启动
启动APP时,应用的进程在后台中运行。
热启动过程中,因为一个应用在创建进程到销毁进程的过程中,只会创建一个Application,所以热启动不会去创建和初始化Application。会直接启动第一个Activity。
测量启动时间
Android API 19之前
通过使用人工计算的方式获取应用的启动时间。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("PocketSphinxActivity", "System.currentTimeMillis():" + System.currentTimeMillis());
setContentView(R.layout.activity_pocket_sphinx);
Log.d("PocketSphinxActivity", "System.currentTimeMillis():" + System.currentTimeMillis());
}
Android API 19之后
Android在系统的Log中添加l了Display的Log信息,用户可以直接通过对Log过滤关键字ActivityManager和Display,就可以查看APP的启动时间
冷启动的优化
由于Application是程序的主入口,Application的初始化速度决定了整个APP 冷启动 的速度,所以可以把Application中进行初始化的操作尽量减少。对与必须要完成的初始化的操作通过多线程实现异步加载,或者使用服务进行加载。可以把Application中的加载操作强制“分开”。这样可以有效的提升Application的初始化效率,减少APP启动所需要的时间。
使用多线程实现异步加载
在Application中onCreate()方法中直接新开一个线程,合理的利用多线程实现异步加载。
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
new Thread(){
@Override
public void run() {
super.run();
LitePal.initialize(this.getApplicationContext());
}
}.start();
}
}
使用服务进行加载
通过使用IntentService服务,在服务里面完成初始化操作,人为的分开后有效的提升Application的初始化速度
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
InitializeService.start(this);
}
}
自定义的服务类
public class InitializeService extends IntentService{
private static final String ACTION_APP_START = "com.demo.czj.offlinedemo";
public InitializeService(String name) {
super("InitializeService");
}
public static void start(Context context){
Intent intent = new Intent(context,InitializeService.class);
intent.setAction(ACTION_APP_START);
context.startService(intent);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if(intent!=null){
String action = intent.getAction();
if(action.equals(ACTION_APP_START)){
LitePal.initialize(this.getApplicationContext());
}
}
}
}
页面预加载
由于加载Activity时,onCreate( )方法是一个耗时操作,所以在页面呈现之前的白屏添加上用户自定义的背景,可以提高APP的用户体验,在第一个Activity的java文件的super.onCreate(savedInstanceState);前添加setTheme(R.style.MyTheme);其中MyTheme可以使用用户APP的logo。
防止APP丢帧
Android系统每16ms(每秒60帧)会发出一个信号,通知系统重绘Activity的界面。所以当某个更新界面的代码块无法在16ms内完成界面上控件值的修改,则会在下一个16ms刷新界面,因此会出现APP掉帧的情况。
所以程序最好在16ms内完成界面的赋值,提高界面的流畅度,避免卡顿情况的出现。