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

歡迎訪問 生活随笔!

生活随笔

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

windows

android4.0 SystemUi系统状态栏

發布時間:2025/4/5 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android4.0 SystemUi系统状态栏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

android4.0系統可以運行于平板電腦和手機上面,這樣對于狀態欄來說,也是有不同風格的,從SystemUi的代碼分類我就可以看出來,google考慮了不同情況下狀態欄的顯示等,

在源代碼里面有這么兩個文件夾需要注意:

com.android.systemui.statusbar.phone? 這個是針對手機而需要的status bar

com.android.systemui.statusbar.tablet?? 這個是針對平板電腦而需要的staus bar(system bar)

?

首先狀態欄是如何啟動起來的呢?

我們都知道系統剛啟動,在SystemServer會加載系統的各種服務,狀態欄也不例外,就是在這個時候創建的,代碼如下:

SystemServer.java

?ActivityManagerService.self().systemReady(new Runnable() {
??????????? public void run() {
??????????????? Slog.i(TAG, "Making services ready");

??????????????? startSystemUi(contextF);
??????????????? try {
??????????????????? if (batteryF != null) batteryF.systemReady();
??????????????? } catch (Throwable e) {
??????????????????? reportWtf("making Battery Service ready", e);
??????????????? }

?

static final void startSystemUi(Context context) {
??????? Intent intent = new Intent();
??????? intent.setComponent(new ComponentName("com.android.systemui",
??????????????????? "com.android.systemui.SystemUIService"));
??????? Slog.d(TAG, "Starting service: " + intent);
??????? context.startService(intent);
??? }

?

通過上面的代碼我就看到系統啟動了com.android.systemui.SystemUIService 這個服務,在這個服務里面就會啟動狀態欄,

但是這里就會有個選擇,是啟動status bar呢 還是啟動 system bar呢,android是這么決定的:

public void onCreate() {
??????? // Pick status bar or system bar.
??????? IWindowManager wm = IWindowManager.Stub.asInterface(
??????????????? ServiceManager.getService(Context.WINDOW_SERVICE));
??????? try {
??????????? SERVICES[0] = wm.canStatusBarHide()??(1)
??????????????????? ? R.string.config_statusBarComponent(2)
??????????????????? : R.string.config_systemBarComponent;(3)
??????? } catch (RemoteException e) {
??????????? Slog.w(TAG, "Failing checking whether status bar can hide", e);
??????? }

??????? final int N = SERVICES.length;
??????? mServices = new SystemUI[N];
??????? for (int i=0; i<N; i++) {
??????????? Class cl = chooseClass(SERVICES[i]);
??????????? Slog.d(TAG, "loading: " + cl);
??????????? try {
??????????????? mServices[i] = (SystemUI)cl.newInstance();
??????????? } catch (IllegalAccessException ex) {
??????????????? throw new RuntimeException(ex);
??????????? } catch (InstantiationException ex) {
??????????????? throw new RuntimeException(ex);
??????????? }
??????????? mServices[i].mContext = this;
??????????? Slog.d(TAG, "running: " + mServices[i]);
??????????? mServices[i].start();
??????? }
??? }

?

上面的(1) 出,會調用到phoneWIndowManager里面對應的那個函數,在那里面會根據配置文件,手機寬高等信息來判斷使用哪一種bar,代碼如下

public boolean canStatusBarHide() {
??????? return mStatusBarCanHide;
??? }

?if (width > height) {
??????????? shortSize = height;
??????????.........

??????? } else {
??????????? shortSize = width;
??????????.......

??????? }

??????? // Determine whether the status bar can hide based on the size
??????? // of the screen.? We assume sizes > 600dp are tablets where we
??????? // will use the system bar.
??????? int shortSizeDp = shortSize
??????????????? * DisplayMetrics.DENSITY_DEFAULT
??????????????? / DisplayMetrics.DENSITY_DEVICE;
??????? mStatusBarCanHide = shortSizeDp < 600;
??????? mStatusBarHeight = mContext.getResources().getDimensionPixelSize(
??????????????? mStatusBarCanHide
??????????????? ? com.android.internal.R.dimen.status_bar_height
??????????????? : com.android.internal.R.dimen.system_bar_height);

?

這里假如手機寬(高) 小于600dp,就認為是手機了,這樣mStatusBarHide = true;

我們回到這里

SERVICES[0] = wm.canStatusBarHide()??

??????????????????? ? R.string.config_statusBarComponent;

??????????????????? : R.string.config_systemBarComponent;

這樣SERVICES[0]? = R.string.config_statusBarComponent (這個字符串就是 com.anroid.systemui.statusbar.phone)

實際上SERVERCES這個數組里面就兩個元素,一個是我們上面的那個com.anroid.systemui.statusbar.phone ,另外一個是PowerUI,這個暫且不管,這個主要是根據電量等信息彈出一些提示框,比如電量低,或者充電器有問題等框。

接下來會調用com.anroid.systemui.statusbar.phone的start方法,注意com.anroid.systemui.statusbar.phone這個類不是一個服務,就是一個普通的類,start方法也是它的一個普通的方法而已。

在start方法里面就會創建狀態欄那些界面對應的各種view,包括下拉狀態欄后的view等,把這些view都創建好以后,就把這個view加載windowmanager里面就可以了,這樣狀態欄就可以顯示出來了,代碼如下:

?

final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
??????????????? ViewGroup.LayoutParams.MATCH_PARENT,
??????????????? height,
??????????????? WindowManager.LayoutParams.TYPE_STATUS_BAR,
??????????????? WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
??????????????????? | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
??????????????????? | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
??????????????? PixelFormat.OPAQUE);
???????
??????? // the status bar should be in an overlay if possible
??????? final Display defaultDisplay
??????????? = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
??????????????? .getDefaultDisplay();
??????? if (ActivityManager.isHighEndGfx(defaultDisplay)) {
??????????? lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
??????? }

??????? lp.gravity = getStatusBarGravity();
??????? lp.setTitle("StatusBar");
??????? lp.packageName = mContext.getPackageName();
??????? lp.windowAnimations = R.style.Animation_StatusBar;
??????? WindowManagerImpl.getDefault().addView(sb, lp);? //這里的sb就是狀態欄view

?

這里需要注意的是 平時看到的狀態欄和下拉后的狀態欄是兩個東西,不要混到一起,而且這里也會創建兩個view,一個是普通的狀態欄view,另外一個下拉后的view,這兩個view都要加載WindosManager里面,添加的代碼基本一樣,但是最重要的是那個參數里面的type是不一樣的,一個是WindowManager.LayoutParams.TYPE_STATUS_BAR,而下拉的那個type是WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL;

總結

以上是生活随笔為你收集整理的android4.0 SystemUi系统状态栏的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 色成人综合 | 日本色中色 | 日韩二级| 国产精品免费观看视频 | 黄色a一级 | 影音先锋成人在线 | 欧洲精品免费一区二区三区 | 欧美成人三级伦在线观看 | 亚洲 欧美 中文字幕 | 插插插插综合 | 亚洲第八页| 成人精品视频一区二区三区尤物 | 欧美在线性 | 好男人网站| 91精品福利 | 国产亚洲精品久久777777 | 69视频在线观看免费 | 成人动漫h在线观看 | ,国产精品国产三级国产 | 久久久久亚洲av无码麻豆 | 久草中文在线视频 | 麻豆视频二区 | 亚洲综合在线五月 | 青青草视频免费播放 | 国产一区二区麻豆 | 人妻一区二区三区视频 | 日韩精品一区二区三区 | 99成人在线观看 | 性色av浪潮av | 秋霞7777鲁丝伊人久久影院 | 国产精品99久久久久久动医院 | 人人射人人干 | 日本深夜福利 | av福利在线看 | 中文字幕777| 日本大尺度电影免费观看全集中文版 | 超碰av在线播放 | 午夜看黄神器 | 久久久久久一区二区 | 92国产精品 | 国产一区二区三区视频网站 | 99精品久久久 | 日韩中文字幕在线观看视频 | 国产免费黄色大片 | 欧美日韩视频免费观看 | 日日摸天天爽天天爽视频 | 成人自拍视频网站 | 欧美日韩一区在线播放 | 超碰人人人人 | 日韩一片 | 日本少妇久久 | 色吟av| 免费视频精品 | 欧美精品乱码 | 亚洲精品电影 | 成人区人妻精品一区二区不卡视频 | 夜夜爽av福利精品导航 | 亚洲性视频 | 亚洲精品一区二区三区在线 | 香蕉视频链接 | 一区二区在线视频 | 日本少妇高潮抽搐 | 久久草国产| 婷婷视频一区 | 日韩精彩视频在线观看 | 伊人96| 在线视频观看一区二区 | 日韩精品一区二区三区在线观看 | 蜜桃视频在线观看污 | 亚洲av无码一区二区三区观看 | 爱情岛论坛自拍 | 中文一二三区 | 天天综合在线观看 | 在线看一区二区 | 亚洲一区二区自偷自拍 | 日韩一级中文字幕 | 国产丝袜精品视频 | 精品欧美一区二区三区久久久 | 4438五月天 | 久久久久久久久久久影视 | 免看一级a毛片一片成人不卡 | 午夜激情欧美 | 理想之城连续剧40集免费播放 | 欧美打屁股| 综合久久2o19 | 破处视频在线观看 | 中国老太婆性视频 | 99久久人妻无码中文字幕系列 | 久本草精品 | 国产伦人伦偷精品视频 | 国产女人水真多18毛片18精品 | 黄色网址在线免费看 | 九色在线播放 | 亚洲午夜无码久久久久 | 一本一道久久综合 | 色哟哟一区二区 | 日批小视频 | 精品无码久久久久久久久久 | 人妻av一区二区三区 |