国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android SystemUI梳理

這篇具有很好參考價值的文章主要介紹了Android SystemUI梳理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


??團隊博客: 汽車電子社區(qū)


一、簡介

??在Android系統(tǒng)中SystemUI是一個系統(tǒng)級的APP,它提供了系統(tǒng)的用戶界面,由system_server進程啟動。SystemUI本身不屬于system_server進程,它是一個獨立的進程。它的HMI包括了狀態(tài)欄、導(dǎo)航欄、通知欄、鎖屏、近期任務(wù)等等。

??SystemServer是一個由Zogyte進程啟動的程序,它負責啟動和管理Android系統(tǒng)中的各種核心服務(wù)。 例如:ActivityManagerService和PackageManagerService,這些服務(wù)也都運行在system_server進程中,為Android系統(tǒng)提供各種功能和接口,供應(yīng)用程序和其他服務(wù)調(diào)用。我們常說的Android Framework其實就是由這些Service組成的。

二、功能介紹

??這部分將主要介紹那些對我們定制自己的SystemUI時有參考價值的模塊。

??1. 狀態(tài)欄
???? StatusBar,負責顯示時間,電量,信號,通知等狀態(tài)信息。
Android SystemUI梳理,Android,android,ui,C++,物聯(lián)網(wǎng) ??2. 導(dǎo)航欄
????NavigationBar,顯示返回,主頁,最近任務(wù)等按鈕。在車載Android中,我們多數(shù)時候會稱為Dock欄(DockBar)。一般負責顯示車控、主頁、藍牙電話等常用功能的快捷控制和入口。
Android SystemUI梳理,Android,android,ui,C++,物聯(lián)網(wǎng)
??3. 通知欄
????NotificationPanel,顯示、控制通知的界面。實際的車載項目中通知欄往往會和【消息中心】合并成一個獨立的APP。
Android SystemUI梳理,Android,android,ui,C++,物聯(lián)網(wǎng) ??4. 快捷控制
????QuickSettings,這個面板可以讓用戶快速地調(diào)整一些常用的設(shè)置,例如亮度、飛行模式、藍牙等。QS面板有多種狀態(tài),包括初級展開面板(Quick Quick Settings,QQS)和完整QS面板(Quick Settings,QS)。用戶可以通過下拉通知欄來打開或關(guān)閉QS面板。
Android SystemUI梳理,Android,android,ui,C++,物聯(lián)網(wǎng) ??5. 其他功能
????一些系統(tǒng)級的對話框、彈窗、動畫、屏保等,這些內(nèi)容相對比較簡單,不再介紹了。而鎖屏、媒體控制等一些功能,車載SystemUI開發(fā)時涉及的不多,也同樣不再介紹。

三、SystemUI 啟動流程

??當Android系統(tǒng)啟動完成后,system_server進程會通過ActivityManagerService啟動一個名為com.android.systemui.SystemUIService的服務(wù),這個服務(wù)是SystemUI的入口類,它繼承了Service類。

SystemServer的源碼位置:/frameworks/base/services/java/com/android/server/SystemServer.java

mActivityManagerService.systemReady(() -> {
        Slog.i(TAG, "Making services ready");
        //...
        t.traceBegin("StartSystemUI");
        try {
            startSystemUi(context, windowManagerF);
        } catch (Throwable e) {
            reportWtf("starting System UI", e);
        }
        t.traceEnd();
    }, t);

??從這里我們可以看出,SystemUI本質(zhì)就是一個Service,通過Pm獲取到的Component是com.android.systemui/.SystemUIService。startSystemUi代碼細節(jié)如下:

private static void startSystemUi(Context context, WindowManagerService windowManager) {
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.android.systemui",
            "com.android.systemui.SystemUIService"));
    intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
    //Slog.d(TAG, "Starting service: " + intent);
    context.startServiceAsUser(intent, UserHandle.SYSTEM);
    windowManager.onSystemUiStarted();
}

??以上就是SystemUI的啟動流程,接下來我們繼續(xù)看SystemUI是如何初始化的。

四、SystemUI 初始化流程

??SystemUI的初始化流程分為以下幾步:

4.1、Application初始化

SystemUIApplication源碼位置:/frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java

??在SystemUI啟動后,首先會調(diào)用Application的onCreate方法,并在onCreate方法中對SystemUI進行初始化。這里我把它分為四個部分的內(nèi)容。
??1、第一部分內(nèi)容不多,主要是通過Dagger拿到SystemUI中的一些創(chuàng)建好的組件,同時設(shè)定一些調(diào)試工具。

public void onCreate() {
    super.onCreate();
    Log.v(TAG, "SystemUIApplication created.");
    // This line is used to setup Dagger's dependency injection and should be kept at the
    // top of this method.
    // TimingsTraceLog 是一個用于跟蹤代碼執(zhí)行時間的工具類,它可以在traceview中看到。
    TimingsTraceLog log = new TimingsTraceLog("SystemUIBootTiming",
            Trace.TRACE_TAG_APP);
    log.traceBegin("DependencyInjection");
    // 此行用于設(shè)置Dagger的依賴注入,并應(yīng)保持在onrecate方法的頂部。
    mContextAvailableCallback.onContextAvailable(this);
    log.traceEnd();

    mLocalHandler = new LocalHandler();

    // 設(shè)置所有服務(wù)繼承的應(yīng)用程序主題。請注意,
    // 僅在清單中設(shè)置應(yīng)用程序主題僅適用于活動。請將其與在那里設(shè)置的主題同步。
    setTheme(R.style.Theme_SystemUI);
}

??2、首先判斷當前進程是否屬于系統(tǒng)用戶。然后根據(jù)SF GPU上下文優(yōu)先級設(shè)置設(shè)定SystemUI的渲染器的上下文優(yōu)先級,最后開啟SystemServer的binder調(diào)用trace跟蹤。

public void onCreate() {
    // 判斷當前進程是否是系統(tǒng)進程。如果是系統(tǒng)進程,那么就注冊 BOOT_COMPLETED 廣播接收器。
    if (Process.myUserHandle().equals(UserHandle.SYSTEM)) {
        // 創(chuàng)建 BOOT_COMPLETED 廣播接收器的意圖過濾器。
        IntentFilter bootCompletedFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
        bootCompletedFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);   
    }
}

??ThreadedRenderer可以簡單理解為一個渲染器,它可以在后臺線程中渲染視圖層次結(jié)構(gòu)。優(yōu)先級越高,渲染速度越快。
??Process.myUserHandle()可以獲取當前進程的用戶類型。如果是從事移動端APP開發(fā),很少會涉及Android系統(tǒng)的多用戶機制。但是由于汽車是一種具有共享屬性的工具,會存在多個家庭成員使用一輛車的情況,所以Android多用戶在車載Android開發(fā)中較為常見。
??當我們在系統(tǒng)設(shè)置中的「系統(tǒng)」「多用戶」添加一個新用戶并切換到這個新用戶時,實際上會再啟動一個SystemUI進程,新的SystemUI進程的用戶ID會從U1X開始,原始的SystemUI的用戶ID則始終是U0。
??3、第三部分注冊監(jiān)聽開機廣播,并在SystemUIService啟動后,再通知SystemUI中的其它組件「系統(tǒng)啟動完成」。

public void onCreate() {
registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (mBootCompleted) return;

            if (DEBUG) Log.v(TAG, "BOOT_COMPLETED received");
            unregisterReceiver(this);
            mBootCompleted = true;
            if (mServicesStarted) {
                final int N = mServices.length;
                for (int i = 0; i < N; i++) {
                    mServices[i].onBootCompleted();
                }
            }

        }
    }, bootCompletedFilter);
    
        IntentFilter localeChangedFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) {
                    if (!mBootCompleted) return;
                    // Update names of SystemUi notification channels
                    NotificationChannels.createAll(context);
                }
            }
        }, localeChangedFilter);
    } else {
        /* 第四部分 */
    }
}

??4、第四部分如果當前用戶非系統(tǒng)用戶那么調(diào)用startSecondaryUserServicesIfNeeded方法。

// 我們不需要為正在執(zhí)行某些任務(wù)的子進程初始化組件。例如:截圖進程等
String processName = ActivityThread.currentProcessName();
ApplicationInfo info = getApplicationInfo();
if (processName != null && processName.startsWith(info.processName + ":")) {
    return;
}
// 對于第二個用戶,boot-completed永遠不會被調(diào)用,因為它已經(jīng)在啟動時為主SystemUI進程廣播了
// 對于需要每個用戶初始化SystemUI組件的組件,我們現(xiàn)在為當前非系統(tǒng)用戶啟動這些組件。
startSecondaryUserServicesIfNeeded();

??在這里插入代碼片`startSecondaryUserServicesIfNeeded方法也是通過startServicesIfNeeded方法來初始化SystemUI中的功能組件。具體是如何初始化,我們之后再來分析。

void startSecondaryUserServicesIfNeeded() {
    String[] names =
              getResources().getStringArray(R.array.config_systemUIServiceComponentsPerUser);
    startServicesIfNeeded(names);
}

??到這里,我們簡單總結(jié)一下SystemUIApplication中其實最主要的工作,其實只有兩個:
????1.、在系統(tǒng)用戶空間中監(jiān)聽開機廣播,并通知SystemUI的功能組件。
????2、在非系統(tǒng)用戶空間中,直接初始化SystemUI的功能組件。

4.2、啟動 SystemUIService

??當Application完成初始化之后,緊接著,SystemUIService就會被啟動。

SystemUIService源碼位置:/frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java
??SystemUIService在onCreate()方法中會調(diào)用((SystemUIApplication) getApplication()).startServicesIfNeeded()方法。

@Override
public void onCreate() {
    super.onCreate();
    // Start all of SystemUI
    ((SystemUIApplication) getApplication()).startServicesIfNeeded();
    ...
}

??這里可能有個疑問:為什么不把startServicesIfNeeded的相關(guān)邏輯寫在Service中,非要寫到Application中?
??是因為,當前用戶不是系統(tǒng)用戶時,startSecondaryUserServicesIfNeeded也需要去調(diào)用startServicesIfNeeded方法進行組件初始化,所以干脆把所有的初始化邏輯都寫到Application中了。文章來源地址http://www.zghlxwxcb.cn/news/detail-806623.html

private void startServicesIfNeeded(String[] services) {
    if (mServicesStarted) {
        return;
    }
    mServices = new SystemUI[services.length];

    if (!mBootCompleted) {
        // check to see if maybe it was already completed long before we began
        // see ActivityManagerService.finishBooting()
        if ("1".equals(SystemProperties.get("sys.boot_completed"))) {
            mBootCompleted = true;
            if (DEBUG) {
                Log.v(TAG, "BOOT_COMPLETED was already sent");
            }
        }
    }

    Log.v(TAG, "Starting SystemUI services for user " +
            Process.myUserHandle().getIdentifier() + ".");

    Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_DISPLAY);
    Message msg = mLocalHandler.obtainMessage();
    msg.obj = services;
    msg.arg1 = services.length;
    msg.arg2 = 0;
    msg.what = EVENT_START_SERVICE;
    msg.sendToTarget();
}

到了這里,關(guān)于Android SystemUI梳理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Android 9.0 原生SystemUI下拉通知欄UI背景設(shè)置為圓角背景的定制(二)

    Android 9.0 原生SystemUI下拉通知欄UI背景設(shè)置為圓角背景的定制(二)

    ?在9.0的系統(tǒng)rom定制化開發(fā)中,在原生系統(tǒng)SystemUI下拉狀態(tài)欄的通知欄的背景是默認白色四角的背景,由于在產(chǎn)品設(shè)計中,需要把四角背景默認改成圓角背景,所以就需要分析系統(tǒng)原生下拉通知欄的每條通知的默認背景,然后通過熟悉systemui的通知欄流程,設(shè)置默認下拉狀態(tài)欄

    2024年02月05日
    瀏覽(26)
  • Android 9.0 原生SystemUI下拉通知欄UI背景設(shè)置為圓角背景的定制(一)

    Android 9.0 原生SystemUI下拉通知欄UI背景設(shè)置為圓角背景的定制(一)

    ?在9.0的系統(tǒng)rom產(chǎn)品定制化開發(fā)中,在原生系統(tǒng)SystemUI下拉狀態(tài)欄的通知欄的通知背景默認是白色四角的背景, 由于在產(chǎn)品設(shè)計中,需要把四角背景默認改成圓角背景,所以就需要分析系統(tǒng)原生下拉通知欄的每條通知的默認背景, 然后通知顯示流程,設(shè)置默認下拉狀態(tài)欄UI中

    2024年02月01日
    瀏覽(33)
  • 一線互聯(lián)網(wǎng)架構(gòu)師360°全方面性能調(diào)優(yōu),android適配器ui

    一線互聯(lián)網(wǎng)架構(gòu)師360°全方面性能調(diào)優(yōu),android適配器ui

    為什么要使用多進程 對于進程的概念,來到這里的都是編程修仙之人,就不再啰嗦了,相信大家倒著、跳著、躺著、各種姿勢都能背出來。 相信很多同學(xué)在實際開發(fā)中,基本都不會去給app劃分進程,而且,在Android中使用多進程,還可能需要編寫額外的進程通訊代碼,還可能

    2024年04月13日
    瀏覽(19)
  • Android 11 SystemUI 啟動流程

    Android 11 SystemUI 啟動流程

    從表面上看, 我們看到的 狀態(tài)欄、通知欄、下拉菜單、導(dǎo)航欄、鎖屏、最近任務(wù)、低電提示 等系統(tǒng)頁面都是 SystemUI 的。SystemUI,在源碼目錄中位于: framework/base/packages 目錄下, 可見 SystemUI 和 framework 是關(guān)聯(lián)的, SystemUI 依賴了很多內(nèi)部 API , 系統(tǒng)資源, SystemUI 編譯是要依賴

    2024年02月13日
    瀏覽(25)
  • [Android14] SystemUI的啟動

    [Android14] SystemUI的啟動

    ? ? ? ? SystemUI是Android系統(tǒng)級應(yīng)用,負責反饋系統(tǒng)及應(yīng)用狀態(tài)并與用戶保持大量的交互。業(yè)務(wù)主要涉及的組成部分包括狀態(tài)欄(Status Bar),通知欄(Notification Panel),鎖屏(Keyguard),控制中心(Quick Setting),音量調(diào)節(jié)(VolumeUI), 近期任務(wù)(Recents)等等。 圖例如下所示: package name: ? ?

    2024年04月27日
    瀏覽(26)
  • Android 10.0 SystemUI啟動流程

    Android 10.0 SystemUI啟動流程

    1、手機開機后,Android系統(tǒng)首先會創(chuàng)建一個Zygote(核心進程)。 2、由Zygote啟動SystemServer。 3、SystemServer會啟動系統(tǒng)運行所需的眾多核心服務(wù)和普通服務(wù)、以及一些應(yīng)用及數(shù)據(jù)。例如:SystemUI 啟動就是從 SystemServer 里啟動的。 4、進入鎖屏界面,開機完成。 SystemServer 中有一個

    2024年02月05日
    瀏覽(30)
  • Android 9-SystemUI:(1)啟動流程

    Android 9-SystemUI:(1)啟動流程

    具體分析(以下代碼示例,講解,都是通過,Android9代碼來舉例) SystemUI,其實是可以看作是一個系統(tǒng)級的服務(wù),也就是SystemUIService, SystemUI的服務(wù)啟動,要從SystemServer.run()方法入手 main 方法里啟動了 run() 方法,而在 run 方法中調(diào)用了startOtherServices() 方法,在啟動startOtherServices(

    2024年02月11日
    瀏覽(14)
  • Android10 SystemUI系列(一)概述

    由于筆者之前負責過SystemUI,之前沒有抽空把很多東西整理出來,趁著最近不太忙,就慢慢動手梳理一下,順便把自己遇到的問題也整理一下,當然自己之前主要看的是android11 之后的源碼。這次主要是Android10 的源碼,當然原理大差不差,也算是自己沉淀一下了 SystemUI 是 And

    2024年02月10日
    瀏覽(16)
  • Android 車載應(yīng)用開發(fā)指南(3) - SystemUI 詳解

    Android 車載應(yīng)用開發(fā)指南(3) - SystemUI 詳解

    Android 車載應(yīng)用開發(fā)指南系列文章 Android 車載應(yīng)用開發(fā)指南(1)- 車載操作系統(tǒng)全解析 Android 車載應(yīng)用開發(fā)指南(2)- 應(yīng)用開發(fā)入門 Android 車載應(yīng)用開發(fā)指南(3)- SystemUI 詳解 SystemUI 全稱 System User Interface ,直譯過來就是 系統(tǒng)級用戶交互界面 ,在 Android 系統(tǒng)中由 SystemUI 負責

    2024年02月19日
    瀏覽(50)
  • 關(guān)于Android SystemUI Flag詳解及使用情景

    觸摸屏幕任何位置 頂部下拉狀態(tài)欄 底部上拉導(dǎo)航欄 Window的變化(如:跳轉(zhuǎn)到其他界面、彈出鍵盤等) View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:(=api16) 作用是隱藏系統(tǒng)NavigationBar。 但是用戶的任何交互,都會導(dǎo)致此Flag被系統(tǒng)清除,進而導(dǎo)航欄自動重新顯示,同時View.SYSTEM_UI_FLAG_FULLSCREEN也會

    2024年02月08日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包