您的当前位置:首页正文

Android启动页优化,去黑屏实现秒启动

来源:华拓网

一、消除启动时的黑屏

点击桌面launcher图标启动APP,闪现的黑色背景其实是出现在我们看到界面第一帧之前。那我们就要想办法让这个黑色的背景变成用户喜欢看到的画面或者让它透明化。有了思路方法也就粗现了,我们有下面两种方案:

  • 自定义WelcomActivity的Theme
    说白了,就是把出现的黑屏通过android:windowBackground属性设置为我们想要的背景。
    1.在Style.xml中定义如下style
<style name="WelcomeStyle" parent="android:Theme">        
      <item name="android:windowBackground">@drawable/welcome_bg</item>   
      <item name="android:windowNoTitle">true</item>    
</style>

其中welcome_bg可以是我们APP的Logo背景。
2.在manifest文件中配置WelcomeActivity

<activity           
        android:theme="@style/WelcomeStyle" 
        android:name=".Activity.WelcomeActivity" >       
</activity>
  • 使用透明主题android:Theme.Translucent.NoTitleBar.Fullscreen
    使用透明主题,点图标后在桌面上要等上那么一小会儿,然后是整个界面才会一下子显示出来,让人误以为慢的是桌面launcher而不是应用(呜呜,手机厂商表示这个锅我不背)。是不是觉得很有小心思呢?其实微信也是这么用的,不行你点微信试试~~
    1.在Style.xml中定义如下style
<style 
        name="Appwelcome" 
        parent="android:Theme.Translucent.NoTitleBar.Fullscreen">
</style>

2.在manifest文件中配置WelcomeActivity

<activity           
        android:theme="@style/Appwelcome" 
        android:name=".Activity.WelcomeActivity" >       
</activity>

好了,就这么简单,现在我们来看看第二种方法的效果:

welcomepage.gif

是不是没有黑色背景闪现了呢,确实是昂。其实我们还能优化,让启动更快,请继续看。

二、启动优化,让APP秒开

  • 优化Application
    从用户点击launcher图标到看到界面第一帧为应用启动过程,主要会经过以下这些方法:
main()->Application:attachBaseContext()->onCreate()->Activity:onCreate()->onStart()->onResume()

main->Activity创建的这个过程会经过一系列framework层的操作,对于系统自动执行的操作我们不易进行优化,但是,如果我们继承Application自定义了自己的Application,可以做如下优化:
1.尽量不将一些业务逻辑放于Application中;
2.不以静态变量的方式在Application中保存应用数据;
3.不要把文件、数据库的操作放在Application

  • 优化启动页Activity
    启动页尽量不要网络请求等耗时操作。如果使用了请求网络等操作在适当的时候应该及时取消的耗时操作。例如,某些时候,当用户点击了launcher图标,但马上又想退出点击了返回键,过了几秒钟用户在使用其他APP,突然跳转到我们的APP那就用户体验感很不好了。所以可以在返回事件中取消掉耗时操作
@Override 
public void onBackPressed() { 
super.onBackPressed(); 
....                               //在这里取消的耗时操作
}

或者也可以流氓一些,直接在启动页Activity重写onKeyDown()方法,首先判断用户按下的是否是返回按键,若是的话则直接返回true,这样就屏蔽了返回按键的后续执行逻辑达到了禁止用户返回操作的目的,看代码

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
        if (keyCode == KeyEvent.KEYCODE_BACK) {
               return true; 
        } 
        return super.onKeyDown(keyCode, event); 
}