android代码旋转屏幕,Android Activity源码分析--windowmanager屏幕旋转研究
注意:鄙人看的是6.0的代碼
Activity里面還是調用了WindowManager來顯示界面。在activity的738行,有這幾行代碼
private Window mWindow;
private WindowManager mWindowManager;
/*package*/ View mDecor = null; //這就是activity的主view,我也不知道怎么表達會比較好 = =
平常用的setContentView方法,最終是調用了mWindow來處理的。
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
mWindow其實一個?PhoneWindow對象,在6169行的attach方法可是看到它的初始化
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor) {
attachBaseContext(context);
mFragments.attachHost(null /*parent*/);
mWindow = new PhoneWindow(this);//我在這里
mWindow.setCallback(this);
mWindow.setOnWindowDismissedCallback(this);
mWindow.getLayoutInflater().setPrivateFactory(this);
...
}
其中mWindowManager是通過mWindow來實現初始化
mWindowManager = mWindow.getWindowManager();
接著看看activity是怎么調用mWindowManager來顯示界面,在源碼第4772行,可以看到一個setVisible方法,這就是activity展示界面的入口吧
public void setVisible(boolean visible) {
if (mVisibleFromClient != visible) {
mVisibleFromClient = visible;
if (mVisibleFromServer) {
if (visible) makeVisible();//我將要展示界面
else mDecor.setVisibility(View.INVISIBLE);
}
}
}
接著看看makeVisible方法是怎么調用mWindowManager來顯示界面。沒錯,其實就是用addview來顯示界面。
void makeVisible() {
if (!mWindowAdded) {
ViewManager wm = getWindowManager();
wm.addView(mDecor, getWindow().getAttributes());
mWindowAdded = true;
}
mDecor.setVisibility(View.VISIBLE);
}
為什么activity能通過android:configChanges="orientation|keyboardHidden" ,能保證界面不重建呢,我們可以看到源碼還有一個onWindowAttributesChanged方法。
public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
// Update window manager if: we have a view, that view is
// attached to its parent (which will be a RootView), and
// this activity is not embedded.
if (mParent == null) {
View decor = mDecor;
if (decor != null && decor.getParent() != null) {
getWindowManager().updateViewLayout(decor, params);
}
}
}
我估計是用了updateViewLayout來刷新頁面,單純看到這里,activity是怎么監聽屏幕旋轉呢?
總結
以上是生活随笔為你收集整理的android代码旋转屏幕,Android Activity源码分析--windowmanager屏幕旋转研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为鸿蒙beta版发布会,华为Harmo
- 下一篇: 我国首个桌面操作系统开发者平台发布 “开