Android启动页优化

近期工作的变动,中间有两个星期的空当,思考了很多事情,工作之前给自己定的是找一家成长中的公司,不那么忙也不那么松散,安安静静的写一个看起来更牛逼的产品,认认真真的提高自己的技术栈,以后会把博客的文章放到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 来下载广告页。 或者是其它异步下载操作,在广告页图片 文件流完全写入后 记录图片大小,或者记录一个标识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值