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

ContentProvider啟動流程示例解析

 更新時間:2023年03月02日 14:46:34   作者:尹學(xué)姐  
這篇文章主要為大家介紹了ContentProvider啟動流程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

ContentProvider是內(nèi)容提供者,可以跨進程提供數(shù)據(jù)。

大家都知道,ContentProvider的啟動,是在Application的onCreate方法之前的,所以ContentProvider的初始化時間會影響整個App的啟動速度。

ContentProvider啟動流程具體是什么樣的呢?讓我們進入源碼的世界來一探究竟。

App啟動

App啟動時,AMS會通過跨進程Binder調(diào)用,訪問到ApplicationThread種的bindApplication方法。

      public final void bindApplication(String processName, ApplicationInfo appInfo,
                List<ProviderInfo> providers, ComponentName instrumentationName,
                ProfilerInfo profilerInfo, Bundle instrumentationArgs,
                IInstrumentationWatcher instrumentationWatcher,
                IUiAutomationConnection instrumentationUiConnection, int debugMode,
                boolean enableBinderTracking, boolean trackAllocation,
                boolean isRestrictedBackupMode, boolean persistent, Configuration config,
                CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
                String buildSerial, boolean autofillCompatibilityEnabled) {
            // 拼接AppBindData,發(fā)送給ActivityThread的H
            sendMessage(H.BIND_APPLICATION, data);
        }

這個方法主要作用是,拼接AppBindData,發(fā)送給ActivityThread中的Handler mH。在這個Handler中,會處理Message,然后調(diào)用handleBindApplication(data)方法。

private void handleBindApplication(AppBindData data) {
    final InstrumentationInfo ii;
    // 創(chuàng)建 mInstrumentation 實例
    if (ii != null) {
        //創(chuàng)建ContextImpl
        final ContextImpl appContext = ContextImpl.createAppContext(this, pi);
        try {
            //創(chuàng)建mInstrumentation實例
            final ClassLoader cl = appContext.getClassLoader();
            mInstrumentation = (Instrumentation) cl.loadClass(data.instrumentationName.getClassName()).newInstance();
        } catch (Exception e) {}
    } else {
        mInstrumentation = new Instrumentation();
    }
    Application app;
    try {
        // 創(chuàng)建 Application 實例
        app = data.info.makeApplication(data.restrictedBackupMode, null);
        mInitialApplication = app;
        // 如果不是backup模式,則調(diào)用installContentProvider,啟動ContentProvider
         if (!data.restrictedBackupMode) {
                if (!ArrayUtils.isEmpty(data.providers)) {
                    //啟動ContentProvider
                    installContentProviders(app, data.providers);
                    mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000);
                }
            }
        try {
            //調(diào)用Application的onCreate
            mInstrumentation.callApplicationOnCreate(app);
        } catch (Exception e) { }
    }
}

這個方法非常長,主要做的事情有以下四點:

  • 創(chuàng)建一個ContentImpl對象
  • 創(chuàng)建一個Instrument對象
  • 創(chuàng)建Application實例
  • 如果不是backup模式,調(diào)用installContentProviders,啟動ContentProvider
  • 調(diào)用ApplicationonCreate方法

installContentProviders

private void installContentProviders(Context context, List<ProviderInfo> providers) {
        final ArrayList<ContentProviderHolder> results = new ArrayList<>();
        // 遍歷所有的providers
        for (ProviderInfo cpi : providers) {
            // 開始啟動ContentProvider
            ContentProviderHolder cph = installProvider(context, null, cpi,
                    false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/);
             results.add(cph);
        }
        // 將成功啟動的provider存儲到AMS的mProviderMap中
        ActivityManager.getService().publishContentProviders(getApplicationThread(), results);
    }

這個方法,循環(huán)遍歷所有待啟動的ContentProvider,調(diào)用installProvider啟動。

 private ContentProviderHolder installProvider(Context context,
            ContentProviderHolder holder, ProviderInfo info,
            boolean noisy, boolean noReleaseNeeded, boolean stable) {
                // 反射創(chuàng)建ContentProvider
                final java.lang.ClassLoader cl = c.getClassLoader();
                LoadedApk packageInfo = peekPackageInfo(ai.packageName, true);
                localProvider = cl.loadClass(className).newInstance();
                provider = localProvider.getIContentProvider();
                // 調(diào)用ContentProvider的attachInfo方法
                localProvider.attachInfo(c, info);
    }

這個方法,通過反射創(chuàng)建ContentProvider,然后調(diào)用attachInfo方法。

 private void attachInfo(Context context, ProviderInfo info, boolean testing) {
        // 調(diào)用onCreate方法
       ContentProvider.this.onCreate();
}

ContentProviderattachInfo方法中,會調(diào)用onCreate方法,完成ContentProvider的啟動。

以上就是ContentProvider啟動流程示例解析的詳細內(nèi)容,更多關(guān)于ContentProvider啟動流程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android Handler機制詳解原理

    Android Handler機制詳解原理

    Handler主要用于異步消息的處理:當(dāng)發(fā)出一個消息之后,首先進入一個消息隊列,發(fā)送消息的函數(shù)即刻返回,而另外一個部分在消息隊列中逐一將消息取出,然后對消息進行處理,也就是發(fā)送消息和接收消息不是同步的處理。 這種機制通常用來處理相對耗時比較長的操作
    2021-11-11
  • Android自定義圓形View實現(xiàn)小球跟隨手指移動效果

    Android自定義圓形View實現(xiàn)小球跟隨手指移動效果

    這篇文章主要為大家詳細介紹了Android自定義圓形View實現(xiàn)小球跟隨手指移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Android使用MobSDK短信驗證

    Android使用MobSDK短信驗證

    這篇文章主要為大家詳細介紹了Android使用MobSDK短信驗證,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Flutter有無狀態(tài)類與State及生命周期詳細介紹

    Flutter有無狀態(tài)類與State及生命周期詳細介紹

    這篇文章主要介紹了Flutter無狀態(tài)類、有狀態(tài)類、State、生命周期,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • Android開發(fā)之自定義UI組件詳解

    Android開發(fā)之自定義UI組件詳解

    這篇文章主要給大家介紹了關(guān)于Android開發(fā)之自定義UI組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Android性能優(yōu)化系列篇UI優(yōu)化

    Android性能優(yōu)化系列篇UI優(yōu)化

    這篇文章主要為大家介紹了Android性能優(yōu)化系列篇UI優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • android項目手機衛(wèi)士來電顯示號碼歸屬地

    android項目手機衛(wèi)士來電顯示號碼歸屬地

    由于詐騙電話越來越猖狂,號碼歸屬地顯示越來越重要,本篇文章主要介紹了android手機衛(wèi)士來電顯示號碼歸屬地,有要的朋友可以了解一下。
    2016-10-10
  • Android利用ContentProvider獲取本地數(shù)據(jù)的方法

    Android利用ContentProvider獲取本地數(shù)據(jù)的方法

    這篇文章主要介紹了Android利用ContentProvider獲取本地數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Android實現(xiàn)界面左右滑動切換功能

    Android實現(xiàn)界面左右滑動切換功能

    相信大家一定都使用過手機QQ和微信之類的軟件,當(dāng)我們使用時不難發(fā)現(xiàn)其界面的切換不僅可以通過點擊頁標(biāo)簽來實現(xiàn),還可以通過左右滑動來實現(xiàn)的,下面小編給大家介紹下如何實現(xiàn)這個功能
    2016-12-12
  • Android UI新組件學(xué)習(xí)和使用

    Android UI新組件學(xué)習(xí)和使用

    在本篇文章中我們給大家總結(jié)了關(guān)于學(xué)習(xí)Android UI新組件的知識點總結(jié)以及注意點詳解,有需要的朋友跟著學(xué)習(xí)下。
    2018-03-03

最新評論

柘荣县| 皋兰县| 道孚县| 崇州市| 惠安县| 富蕴县| 肃南| 南投县| 阜康市| 天峨县| 广丰县| 葵青区| 岚皋县| 浦城县| 蕉岭县| 南开区| 东港市| 泰和县| 新野县| 磐安县| 宿州市| 达日县| 多伦县| 佳木斯市| 柞水县| 梁平县| 临朐县| 石柱| 康马县| 屏东县| 潮州市| 水富县| 昭平县| 宿松县| 酒泉市| 苗栗市| 连城县| 民县| 达拉特旗| 邵东县| 利川市|