日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android代码旋转屏幕,Android Activity源码分析--windowmanager屏幕旋转研究

發布時間:2023/12/10 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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屏幕旋转研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。