最近在看xml解析时,发现phoneWindow内部setContentView函数会重新刷新整个Activity view树,既然这样,那么我们使用setContentView是不是就可以实现Splash的效果了,这样对整个Activity的生命周期会产生影响吗,带着问题我们进行了demo测试。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Log.d(LOG_NAME,"onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setContentView(R.layout.activity_main);
}
},3000);
}
注意:不能在onCreate中直接多次setContentView,这样会直接多次刷新整个Activity view树,人眼分辨出来就是最后一次的效果。通过Looper延时处理会更好一点,也不需要开新的子线程。
呈现的效果跟Splash一样,由于无需单独创建Activity,就整体性能而言是有一定优化的。
上图为对应Activity的生命周期状态,说明setContentView对Activity的生命周期是没有影响的,所以在使用的时候需要注意相关View的处理时间。对复杂的视图逻辑,也不建议这么创建Splash,会增加很多逻辑负担。合理的时候可以优化一些情况下的用户体验,当然使用单一视图的VISIBLE和GONE有时也可以达到相同效果。
推荐一篇相关的文章 Activity 与 Window 与 View 之间的关系