Activity与AppCompatActivity的setContentView的源码分析
Activity 中的MainActivity extends AppcompatActivity 与 extends Activity的区别呢?
解答:
AppCompatActivity是继承自v4的FragmentAvtivity,并且加入了很多的新特性。这个可以很好的兼容老设备
且在AppCompatActivity和Activity的区别在于app运行后是否有ActionBar的区别,界面(appname显示或者不显示)。对程序本身没有什么影响。
首先是我们打开一个Android应用,映入眼帘的是MainActivity extends AppcompatActivty,这是现在比较高版本的Android studio的创建的方式。或许你们见MainActivity extends Activity的版本,今天我们就是关于两者的setContextView方法进行讲解。
这篇文章我们先从Activity的方式进行讲解。
首先我们看到Activity的setContentView方法源码
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
由于上面的源码得到,setContentView是移交给了getWindow返回的对象进行setContentView方法的实现。然而getWindow返回的对象是什么呢?这不经让我们好奇!!
我们再去查看源码:
有以上得知,PhoneWindow是Window的唯一实现类。所以实现setContentView方法的是PhoneWindow,所以我们再去打开PhoneWindow的setContentView方法:(我截取了关键性代码)
@Override
public void setContentView(int layoutResID) {
// Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window
// decor, when theme attributes and the like are crystalized. Do not check the feature
// before this happens.
if (mContentParent == null) {
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
getContext());
transitionTo(newScene);
} else