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

Android那兩個你碰不到但是很重要的類之ActivityThread

 更新時間:2023年05月07日 10:06:59   作者:Drummor  
上篇文章我們聊了些Android里那些我們平時碰不到但很重要的類ViewRootImpl,這一篇我們就來看看另外那個類ActivityThread,文中有相關(guān)的代碼示例,感興趣的同學可以跟著小編一起來學習

前言

上篇文章我們聊了些Android里那些我們平時碰不到但很重要的類ViewRootImpl,這一篇我們就來看看另外那個類ActivityThread。

通過本文能了解一下內(nèi)容

1、和系統(tǒng)進程打交道的橋頭堡

應用進程起來之后ART(Android Runtime)第一站就是ActivityThread,代碼層面上就是ActivityThread的main()方法,是不是很熟悉,爺青回啊,這不就是java的main方法嘛

   public static void main(String[] args) {
        Looper.prepareMainLooper();
        ActivityThread thread = new ActivityThread();
        thread.attach(false, startSeq);
        sMainThreadHandler = thread.getHandler();
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

該方法是一個靜態(tài)方法,里面做了重要的兩件事

  • 創(chuàng)建了讓主線程Looper開始工作,并創(chuàng)建了一個Handler
  • 給system_server【遞紙條】告訴他聯(lián)系方式,告訴sytem_servr進程與應用進程取得聯(lián)系可以通過ApplicationThread這個binder。看下面這個代碼
    private void attach(boolean system, long startSeq) {
            final IActivityManager mgr = ActivityManager.getService();
            mgr.attachApplication(mAppThread, startSeq);//調(diào)用遠端的binder
    }
  • 通過ActivityManager.getService()拿到system_server進程的binder,然后把mAppThread binder傳遞過去。mAppThreadApplicationThread的一個對象,是ActivityThread的一個內(nèi)部類。
  • 取得聯(lián)系后的第一站創(chuàng)建Applicaiton。
   private class ApplicationThread extends IApplicationThread.Stub {
        @Override
        public final void bindApplication() {
            sendMessage(H.BIND_APPLICATION, data);
        }
  • 接下來就是H主線程的Hanlder,調(diào)用handleBindApplication
 private void handleBindApplication(AppBindData data) {
        Application app;
        data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo, isSdkSandbox);//內(nèi)部創(chuàng)建LoadedApk
        app = data.info.makeApplicationInner(data.restrictedBackupMode, null);//內(nèi)部創(chuàng)建Applicaiton對象,調(diào)用onCreate()方法
        installContentProviders(app, data.providers); //cotentprovider初始化
        mInstrumentation.callApplicationOnCreate(app);//調(diào)用onCreate()方法
    }
  • 這里找到了為什么使用ContentProvider能夠?qū)崿F(xiàn)初始化,構(gòu)建的時候會創(chuàng)建ContenProvider。

  • IActivityManager(binder):應用進程和SystemServer進程打交道的時候。
  • AppliactionThread(binder):SystemServer進程與應用進程通信。

2、為什么使用ContentProvider可以實現(xiàn)初始化

 private void handleBindApplication(AppBindData data) {
        Application app;
        data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo, isSdkSandbox);//內(nèi)部創(chuàng)建LoadedApk
        app = data.info.makeApplicationInner(data.restrictedBackupMode, null);//內(nèi)部創(chuàng)建Applicaiton對象,調(diào)用onCreate()方法
        installContentProviders(app, data.providers); //cotentprovider初始化
        mInstrumentation.callApplicationOnCreate(app);//調(diào)用onCreate()方法
    }

上一段分析時已經(jīng)找打了答案,應用進程被拉起來之后,在創(chuàng)建Application對象調(diào)用attachBaseContext()和onCreate()方法之間會調(diào)用ContentProvider的onCreate()方法這也是很多第三方SDK使用該特性實現(xiàn)初始化的原理。

3、Activity是什么時候開始渲染的

  public void handleResumeActivity() {
        performResumeActivity(r, finalStateRequest, reason)//調(diào)用Activity onResume
        final Activity a = r.activity;
        View decor = r.window.getDecorView();
        ViewManager wm = a.getWindowManager();
        a.mWindowAdded = true;
        wm.addView(decor, l);
   }

ActivityThread.javahandleResumeActivity()有這樣一段代碼,我們可以得出結(jié)論,Activity渲染的起點是在 onResume階段,在onResume階段會把decorView交給WindowManager開始執(zhí)行渲染。

4、原來還可以監(jiān)控組件的生命周期

class H extends Handler {
  
    public static final int RECEIVER                = 113; //廣播接收者
  
    @UnsupportedAppUsage
    public static final int CREATE_SERVICE          = 114;//Service創(chuàng)建
  
    public static final int INSTALL_PROVIDER        = 145;//ContentProvider
  
    public static final int RELAUNCH_ACTIVITY = 160; //Activity啟動
  
   public void handleMessage(Message msg) {
        if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
        switch (msg.what) {
            case BIND_APPLICATION:
                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
                AppBindData data = (AppBindData)msg.obj;
                handleBindApplication(data);
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                break;
            case RECEIVER:
                handleReceiver((ReceiverData)msg.obj);
                break;
            case CREATE_SERVICE:
                handleCreateService((CreateServiceData)msg.obj);
                break;
            case BIND_SERVICE:
                handleBindService((BindServiceData)msg.obj);
                break;
                
            case RELAUNCH_ACTIVITY:
                handleRelaunchActivityLocally((IBinder) msg.obj);
                break;
        }
    }
}

系統(tǒng)進程(system_server)指揮應用進程組件生命周期的第一站其實就在ActivityThread這里,交給H對象其實是主線程的Handler來分發(fā)處理,如上。我們可以反射拿到這一信息,可以監(jiān)控到主線程對于這些組件調(diào)度的信息,這一信息對我們監(jiān)控排查ANR很有幫助。

5 、SharedPreference被聲討的根源

 private void handleStopService(IBinder token) {
     QueuedWork.waitToFinish();      
 }
 public void handlePauseActivity(){
      QueuedWork.waitToFinish(); 
 }
 public void handleStopActivity(){
    QueuedWork.waitToFinish(); 
 }
public void handleServiceArgs(){
   QueuedWork.waitToFinish(); 
}

ActivityThread的以上方法里會調(diào)用 QueuedWork.waitToFinish(); 該代碼會堵塞主線程執(zhí)行等待SP的寫入操作。這也是SP造成ANR的根源。

稍微展開點

   public static void waitToFinish() {
        while (true) {
                Runnable finisher;
                synchronized (sLock) {
                    finisher = sFinishers.poll();
                }
                if (finisher == null) {
                    break;
                }
                finisher.run();
            }
        } 
    }

waitToFinish()方法里有這樣一段代碼,sFinishers是一個List里面是存放的SP寫入操作,會在SP執(zhí)行commit和apply的時候放入進來。字節(jié)跳動團隊就是在此處hook了使其poll()方法永遠放回空,來杜絕此處產(chǎn)生的ANR。

7 、總結(jié)

通過閱讀ActivityThread的源碼我們能在其中獲取很多有用的知識。系統(tǒng)進程和應用進程通信的橋梁,Activity真正渲染的起始點,ContentProvider能實現(xiàn)SDK自動初始化的原理等都在ActivityThread看到他們的影子,希望本文對你有所啟發(fā)有所幫助。

以上就是Android那兩個你碰不到但是很重要的類之ActivityThread的詳細內(nèi)容,更多關(guān)于Android ActivityThread的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android開發(fā)人臉識別登錄功能

    Android開發(fā)人臉識別登錄功能

    這篇文章主要介紹了Android開發(fā)人臉識別登錄功能,這個很多公司都在使用,非常流行,今天小編給大家從頭到尾做一個案例分享到腳本之家平臺,需要的朋友參考下吧
    2019-11-11
  • Android Zipalign工具優(yōu)化Android APK應用

    Android Zipalign工具優(yōu)化Android APK應用

    本文主要介紹Android Zipalign工具優(yōu)化Android APK應用,這里整理了相關(guān)資料及簡單優(yōu)化實例,有需要的小伙伴可以參考下
    2016-09-09
  • Android自定義圖片輪播Banner控件使用解析

    Android自定義圖片輪播Banner控件使用解析

    這篇文章主要為大家詳細介紹了Android自定義圖片輪播Banner控件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android實現(xiàn)可瀏覽和搜索的聯(lián)系人列表

    Android實現(xiàn)可瀏覽和搜索的聯(lián)系人列表

    這篇文章主要為大家詳細介紹了Android實現(xiàn)可瀏覽和搜索的聯(lián)系人列表的相關(guān)代碼,瀏覽所有聯(lián)系人和根據(jù)名稱搜索聯(lián)系人,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android之TextView自適應大小

    Android之TextView自適應大小

    對于設(shè)置TextView的字體默認大小對于UI界面的好看程度是很重要的,小屏幕設(shè)置的文字過大或者大屏幕設(shè)置的文字過小都造成UI的不美觀?,F(xiàn)在就讓我們學習自適應大小的TextView控件。下面跟著小編一起來看下吧
    2017-03-03
  • 去掉RecycleView或者ListView上下滑動陰影的方法

    去掉RecycleView或者ListView上下滑動陰影的方法

    下面小編就為大家分享一篇去掉RecycleView或者ListView上下滑動陰影的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Android編程之菜單實現(xiàn)方法

    Android編程之菜單實現(xiàn)方法

    這篇文章主要介紹了Android編程之菜單實現(xiàn)方法,以實例形式較為詳細的分析了Android編程實現(xiàn)菜單的布局及功能相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Android編程之代碼創(chuàng)建布局實例分析

    Android編程之代碼創(chuàng)建布局實例分析

    這篇文章主要介紹了Android編程之代碼創(chuàng)建布局的方法,結(jié)合實例形式分析了Android通過代碼創(chuàng)建布局的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Android EditText限制輸入字符的方法總結(jié)

    Android EditText限制輸入字符的方法總結(jié)

    這篇文章主要介紹了 Android EditText限制輸入字符的方法總結(jié)的相關(guān)資料,這里提供了五種方法來實現(xiàn)并進行比較,需要的朋友可以參考下
    2017-07-07
  • 詳解Android Libgdx中ScrollPane和Actor事件沖突問題的解決辦法

    詳解Android Libgdx中ScrollPane和Actor事件沖突問題的解決辦法

    這篇文章主要介紹了詳解Android Libgdx中ScrollPane和Actor事件沖突問題的解決辦法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評論

达州市| 芦山县| 通州区| 通海县| 义马市| 古蔺县| 泸州市| 景德镇市| 汶川县| 隆回县| 绵竹市| 广丰县| 侯马市| 右玉县| 屏山县| 克什克腾旗| 张家川| 临高县| 洪雅县| 阿尔山市| 牟定县| 呼伦贝尔市| 开封市| 玉龙| 平顶山市| 台湾省| 修武县| 韶关市| 铜川市| 肃南| 文成县| 安丘市| 项城市| 尼木县| 略阳县| 东乡| 华阴市| 黄浦区| 荔浦县| 乐陵市| 青岛市|