近期工作的变动,中间有两个星期的空当,思考了很多事情,工作之前给自己定的是找一家成长中的公司,不那么忙也不那么松散,安安静静的写一个看起来更牛逼的产品,认认真真的提高自己的技术栈,以后会把博客的文章放到csdn上。
------------------------- 一段不太通顺的话写在前面 -----------------------------------------
入职第一天快下班的时候想把启动页做一个优化。
一个牛逼的产品,必须从Splash开始。
开始优化我们之前必须先要了解下应用程序的启动方式,启动方式决定了用户从点击图标到展开Splash界面的时间,应用启动有三种方式:
冷启动,热启动和温启动,因为冷启动相比于热启动和温启动所进行的任务更负责,我们这里只需要做好冷启动的处理就好
第一步:
我们知道如果我们不进行splash的任何处理就会在开启时候出现白色或者黑色的空白,之后才会出现你设置的开启界面图片,这个主要是因为我们通常情况在application初始化了一些比如im等第三方服务导致的延时。
通常情况我们会在百度之后,会根据网上给出的解决方案进行优化。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
查阅资料多一点会加上:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowBackground">@mipmap/launch</item> //闪屏页图片
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
看起来一切很完美,也很好。那么我们考虑一个问题,此时的application初始化导致的延时还存不存在?答案显然是存在的,因为我们并没有让app启动的更快,所以此方案也只是从视觉上”欺骗“了用户。
第二步:
我们开始优化application,优化这里从原则上讲,我们需要避免负责布局的初始化,i/o读写,网络请求等。
我们从两个方面去做:
1 将一些可以放在子线程去初始化,比如bugly,友盟等,原则是子线程不会影响到组件使用,有一个办法判断是不是能放在子线程去初始化,给子线程加一个延迟。
给子线程设置一个后台进程,不抢占资源。
new Thread(new Runnable() {
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
Thread.sleep(10000);
//todo
}
}).start();
2 给必须在主线程初始化,能做延时的
handler.postDelayed(new Runnable() {
@Override
public void run() {
}
}, 5000);
第三步:
下面我们再考虑一个问题,如果你的机器巨卡无比,那么初始化了2000ms,以后还要等启动页的延时2000ms是不是烦躁。
我们从总时间上也可以做优化
Application 初始化后会调用 attachBaseContext() 方法,再调用 Application 的 onCreate(),再到入口 Activity的创建和执行 onCreate() 方法。所以我们就可以在 Application 中记录启动时间。
//Application
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
SPUtil.putLong("application_attach_time",
System.currentTimeMillis());
}
//Activity
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
long appAttachTime = SPUtil.getLong("applicationAttachTime");
long diffTime = System.currentTimeMillis() - appAttachTime;//从application到入口Acitity的时间
}
第四步:
在入口 Acitivity 中开启 IntentService 来下载广告页。 或者是其它异步下载操作,在广告页图片 文件流完全写入后 记录图片大小,或者记录一个标识。