APP启动方式及启动优化

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内完成界面的赋值,提高界面的流畅度,避免卡顿情况的出现。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值