最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android ActivityManagerService啟動(dòng)流程詳解

 更新時(shí)間:2023年02月17日 09:24:23   作者:守住Android最后的光  
這篇文章主要介紹了Android ActivityManagerService啟動(dòng)流程,AMS,即ActivityManagerService,是安卓java framework的一個(gè)服務(wù),運(yùn)行在system_server進(jìn)程。此服務(wù)十分重要,因?yàn)樗芾碇沧康乃拇蠼M件,是安卓APP開(kāi)發(fā)者最常接觸到的一個(gè)服務(wù)

概述

AMS是系統(tǒng)的引導(dǎo)服務(wù),應(yīng)用進(jìn)程的啟動(dòng)、切換和調(diào)度、四大組件的啟動(dòng)和管理都需要AMS的支持。從這里可以看出AMS的功能會(huì)十分的繁多,當(dāng)然它并不是一個(gè)類(lèi)承擔(dān)這個(gè)重責(zé),它有一些關(guān)聯(lián)類(lèi)。

AMS的啟動(dòng)流程

1:SystemServer#main -> 2:SystemServer#run -> 3:SystemServiceManager#startBootstrapServices

1:首先SystemServer進(jìn)程運(yùn)行main函數(shù), main函數(shù)內(nèi)部只調(diào)用了一個(gè)自己的run()方法.

 public static void main(String[] args) {
        new SystemServer().run();
    }

2:SystemServer的run()方法注釋非常多,可以自己看一下.中文注釋沒(méi)有使用//了, 不然顏色比較難以看清

 private void run() {
       <--開(kāi)始!-->
            // Prepare the main looper thread (this thread).
            <--準(zhǔn)備主線程(該線程)-->
            android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);
            android.os.Process.setCanSelfBackground(false);
            Looper.prepareMainLooper();
            Looper.getMainLooper().setSlowLogThresholdMs(
                    SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
?
            <--初始化native服務(wù)-->
            System.loadLibrary("android_servers");
            <--初始化系統(tǒng)上下文-->
            createSystemContext();
            <--創(chuàng)建system service manager!!!-->    
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // Prepare the thread pool for init tasks that can be parallelized
            SystemServerInitThreadPool.get();
?
?
       <--打開(kāi)系統(tǒng)服務(wù)-->
            <--啟動(dòng)引導(dǎo)服務(wù)-->
            <--用SystemServiceManager啟動(dòng)了ActivityManagerService、PowerManagerService、 PackageManagerService等服務(wù)-->
            startBootstrapServices();
            <--核心服務(wù)-->
            <--啟動(dòng)BatteryService、UsageStatsService和WebViewUpdateService-->
            startCoreServices();
            <--啟動(dòng)其他服務(wù)-->
            <--啟動(dòng)了WMS,CameraService、AlarmManagerService、VrManagerService等服務(wù)-->
            startOtherServices();
      <--Loop forever-->
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

3:SystemServer的startBootstrapServices()方法

SystemServer.java
//啟動(dòng)AMS
 private void startBootstrapServices() {
        ...
        <--調(diào)用SystemServiceManager的startSErvice()方法, 傳入Lifecycle.class字節(jié)碼文件的參數(shù), 
        通過(guò)反射實(shí)例化Lifecycle對(duì)象,并啟動(dòng)AMS(通過(guò)這個(gè)參數(shù)"ActivityManagerService.Lifecycle.class"可以看出
        Lifecycle是AMS的一個(gè)內(nèi)部類(lèi))-->
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
?
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
 }
?
SystemServiceManager.java
 public SystemService startService(String className) {
        <--使用反射獲取.class文件-->
        Class serviceClass = Class.forName(className);
        return this.startService(serviceClass);
    }
SystemServiceManager.java
 public <T extends SystemService> T startService(Class<T> serviceClass) {
        String name = serviceClass.getName();
        SystemService service;
        Constructor<T> constructor = serviceClass.getConstructor(Context.class);
        <--通過(guò)反射,調(diào)用constructor的newInstance方法來(lái)創(chuàng)建Lifecycle類(lèi)型的service對(duì)象-->
        service = (SystemService)constructor.newInstance(this.mContext);
        <--把該服務(wù)加入到系統(tǒng)服務(wù)集合當(dāng)中, 該系統(tǒng)服務(wù)集合就是SystemServiceManager類(lèi)的list類(lèi)型的成員變量-->
        this.mServices.add(service);
        <--調(diào)用反射類(lèi)的onStart()方法開(kāi)啟AMS服務(wù)(實(shí)際上Lifecycle內(nèi)部類(lèi)雖然是靜態(tài)的, 
        但是顯示的擁有一個(gè)AMS的對(duì)象, 該方法就是利用這個(gè)AMS對(duì)象調(diào)用AMS的start()方法)-->
        service.onStart();
        <--返回該服務(wù)-->
        return service; 
  }
?

19年的時(shí)候初入安卓系統(tǒng)開(kāi)發(fā)的崗位,對(duì)整個(gè)系統(tǒng)的認(rèn)識(shí)比較少。 現(xiàn)在看來(lái)AMS的啟動(dòng)過(guò)程相對(duì)來(lái)說(shuō)是比較簡(jiǎn)單的。 在系統(tǒng)開(kāi)機(jī)啟動(dòng)之后,system_server會(huì)執(zhí)行三大服務(wù)啟動(dòng)

startBootstrapServices() 啟動(dòng)引導(dǎo)服務(wù),在這里實(shí)際上已經(jīng)new了AMS,在new方法里,已經(jīng)初始化了AMS的大部分重要的屬性。AMS的Looper和各種handler也是在這里準(zhǔn)備好的。
private void startBootstrapServices() {
    ...
       ActivityTaskManagerService atm = mSystemServiceManager.startService(
               ActivityTaskManagerService.Lifecycle.class).getService();
            mActivityManagerService = ActivityManagerService.Lifecycle.startService(
               mSystemServiceManager, atm);
            mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
            mActivityManagerService.setInstaller(installer);
       ...
}
   public static final class Lifecycle extends SystemService {
       private final ActivityManagerService mService;
       private static ActivityTaskManagerService sAtm;
       public Lifecycle(Context var1) {
           super(var1);
           this.mService = new ActivityManagerService(var1, sAtm);
       }
       public static ActivityManagerService startService(SystemServiceManager var0, ActivityTaskManagerService var1) {
           sAtm = var1;
           return ((ActivityManagerService.Lifecycle)var0.startService(ActivityManagerService.Lifecycle.class)).getService();
       }

在創(chuàng)建完AMS之后,system_server的run方法會(huì)執(zhí)行到startOtherServices(),在啟動(dòng)“其他服務(wù)”完畢之后,會(huì)調(diào)入到AMS的systemReady()方法,在這里會(huì)啟動(dòng)launcher。 可以說(shuō),在這個(gè)方法執(zhí)行完畢之后,系統(tǒng)就已經(jīng)啟動(dòng)完成了。如果我們先要在系統(tǒng)啟動(dòng)的過(guò)程中在java framework中加入自己的代碼,可以在systemReady()這個(gè)方法中,完成。(比如注冊(cè)自己的廣播接受器)

public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
            if (bootingSystemUser) {
                mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
            }
 }           

啟動(dòng)流程圖

到此這篇關(guān)于Android ActivityManagerService啟動(dòng)流程詳解的文章就介紹到這了,更多相關(guān)Android ActivityManagerService內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • android自由改變Dialog窗口位置的方法

    android自由改變Dialog窗口位置的方法

    這篇文章主要介紹了android自由改變Dialog窗口位置的方法,涉及Android操作Dialog窗口相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • Android對(duì)話框使用方法詳解

    Android對(duì)話框使用方法詳解

    這篇文章主要介紹了Android對(duì)話框使用方法,包括提示對(duì)話框、單選對(duì)話框、復(fù)選對(duì)話框、列表對(duì)話框等,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android顯示網(wǎng)絡(luò)圖片實(shí)例

    Android顯示網(wǎng)絡(luò)圖片實(shí)例

    這篇文章主要介紹了Android顯示網(wǎng)絡(luò)圖片的方法,以實(shí)例形式展示了Android程序顯示網(wǎng)絡(luò)圖片的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • 手把手教你實(shí)現(xiàn)Android編譯期注解

    手把手教你實(shí)現(xiàn)Android編譯期注解

    今天給大家介紹Android編譯期注解sdk的步驟以及注意事項(xiàng),并簡(jiǎn)要分析了運(yùn)行時(shí)注解以及字節(jié)碼技術(shù)在生成代碼上與編譯期注解的不同與優(yōu)劣,感興趣的朋友一起看看吧
    2021-07-07
  • 接口對(duì)象的實(shí)例化在接口回調(diào)中的使用方法

    接口對(duì)象的實(shí)例化在接口回調(diào)中的使用方法

    下面小編就為大家?guī)?lái)一篇接口對(duì)象的實(shí)例化在接口回調(diào)中的使用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 調(diào)用startService會(huì)拋出IllegalStateException異常解決

    調(diào)用startService會(huì)拋出IllegalStateException異常解決

    這篇文章主要為大家介紹了調(diào)用startService會(huì)拋出IllegalStateException異常解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Android?Flutter繪制扇形圖詳解

    Android?Flutter繪制扇形圖詳解

    在開(kāi)發(fā)過(guò)程中通常會(huì)遇到一些不規(guī)則的UI,比如不規(guī)則的線條,多邊形,統(tǒng)計(jì)圖表等等,用那些通用組件通過(guò)組合的方式無(wú)法進(jìn)行實(shí)現(xiàn),這就需要我們自己進(jìn)行繪制。本文將利用Flutter繪制扇形圖,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Android中給按鈕同時(shí)設(shè)置背景和圓角示例代碼

    Android中給按鈕同時(shí)設(shè)置背景和圓角示例代碼

    相信每位Android開(kāi)發(fā)者們都遇到過(guò)給按鈕設(shè)置背景或者設(shè)置圓角的需求,但是如果要同時(shí)設(shè)置背景和圓角該怎么操作才是方便快捷的呢?這篇文章通過(guò)示例代碼給大家演示了Android中給按鈕同時(shí)設(shè)置背景和圓角的方法,有需要的朋友們可以參考借鑒。
    2016-10-10
  • Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能

    Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能

    這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android直播軟件搭建之實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的詳細(xì)代碼

    Android直播軟件搭建之實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的詳細(xì)代碼

    這篇文章主要介紹了Android直播軟件搭建之實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的詳細(xì)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

隆回县| 黎川县| 志丹县| 乌兰察布市| 黄梅县| 石首市| 安顺市| 东莞市| 黔西县| 龙门县| 成武县| 封开县| 赤壁市| 怀安县| 建瓯市| 浮山县| 水城县| 固安县| 文山县| 诸暨市| 江孜县| 准格尔旗| 瓦房店市| 礼泉县| 秦皇岛市| 景泰县| 玉溪市| 满城县| 平和县| 南和县| 盐山县| 秭归县| 吕梁市| 平和县| 洛阳市| 黔南| 乐至县| 濉溪县| 贵港市| 白河县| 科尔|