android性能优化之解决启动白屏问题

android性能优化之解决启动白屏问题

1.前言:

  在我们冷启动app的时候,经常会发现点击应用图标后,应用打开是先有一个短暂的白屏现象(特别是在第版本手机以及手机内存容量较低时),影响用户体验,此时作为app的开发人员,就要解决这个性能问题。

2.原因:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

上图为我们主页面代码,我们知道,当页面执行完setContentView()方法后,会完成主页面的渲染。但在启动MainActivity到执行setContentView()方法的这段时间,展示的是window的窗口背景。在setContentView()方法之前加上一个sleep方法让主线程睡几秒可验证此结论,其实我们看的的白屏或者黑屏并不是什么异常场景,但确实影响体验,需要解决。

3.分析:

既然我们知道了白屏就是在setContentView()方法之前的window窗口背景,那我们有什么方法能解决呢?

通常情况下,一个应用的启动大概有以下三种方式:

1.主页面点击图标启动(MainActivity)

2.浏览器等第三方应用拉起

3.通知栏

网上有很多人给出的解决方式是給MainActivity配置一个带有背景图片(如等待图片、引导图片、欢迎图片等)的主题;如下,先在styles.xml中自定义一个主题。

<style name="startTheme" parent="AppTheme">

<!--可以通过设置背景透明解决,但是还是稍微影响体验效果<item name="android:windowIsTranslucent">true</item>-->
<item name="android:windowBackground">@drawable/start</item>
<item name="windowNoTitle">true</item>
</style>

然后再清单文件AndroidManifest.xml中配置MainActivity

<activity android:name=".MainActivity" 
android:theme="@style/startTheme"
>
</activity>

这样就可以在白屏时间展示我们想要展示的图片。

这个方法给我提供了一个正确的思路,但是是有弊端的,正如我们之前提到的我们打开app的入口不仅仅是通过桌面点击图标,当遇到浏览器、第三方应用打开app或从通知栏打开app时,此时打开的app页面就不一定是唯一的MainActivity,有可能是商品详情页,有可能是新闻详情页等,如果在这些页面都加theme就会很混乱不好管理,因为这些页面也有从app内部跳转的情况,此时是不应该要背景主题的(只有在app启动的时候給用户背景感知,如果在app之间的页面跳转展示主题背景,就画蛇添足了)。

4.优化解决方法:

    通过上面分析我们知道单纯的更改MainActivity主题是有弊端的,解决方法就是我们再创建一个activity,SplashActivity来作为外来跳转或者打开app的统一入口,然后再进行跳转的目标activity。

public class SplashActivity extends AppCompatActivity{

@Override
public void onCreate (Bundle savedInstanceState,PersistableBundle persistentState){
super.onCreate(savedInstanceState,persistentState);
//这里要根据目标activity跳转
startActivity(new Intent(this,MainActivity.class));
}
@Override
protected void onStop(){
super.onStop();
//根据activity生命周期,放在stop方法里finish,如果在startActivity后就finish有可能目标activity启动失败就直接关闭当前页面,有可能出现白屏,展示桌面的现象
finish();
}
}

为SplashActivity配置主题

​
<activity android:name=".SplashActivity" 
android:theme="@style/startTheme"
>
</activity>

​

5.小结:

1.在启动页的开始到setContentView()方法执行前这段时间会显示window系统背景,导致白屏。

2.通过设置theme背景来解决白屏

3.当遇到浏览器、第三方应用打开app或从通知栏打开app时,此时打开的app页面就不一定是唯一的MainActivity,需要专门设置和activity作为启动页。

注意:在跳转目标页面并结束当前activity时,应该讲finish放在onStop()方法中执行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值