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

Android中persistent屬性用法詳解

 更新時間:2016年06月28日 15:40:53   作者:zeo  
這篇文章主要介紹了Android中persistent屬性用法,詳細(xì)分析了persistent屬性的功能及相關(guān)用法,需要的朋友可以參考下

本文實例講述了Android中persistent屬性用法。分享給大家供大家參考,具體如下:

前段時間在研究telephony時,一直沒有在framework下發(fā)現(xiàn)對telephony的初始化(PhoneFactory.Java中的makeDefaultPhones函數(shù))的調(diào)用。結(jié)果全局搜索之后發(fā)現(xiàn)在application PhoneApp(packages/apps/Phone)中調(diào)用了。但是application PhoneApp既沒有被Broadcast喚醒,也沒有被其他service調(diào)用,那么是Android是通過什么方式來啟動PhoneApp,所以就發(fā)現(xiàn)了屬性android:persistent。

在AndroidManifest.xml定義中,application有這么一個屬性android:persistent,根據(jù)字面意思來理解就是說該應(yīng)用是可持久的,也即是常駐的應(yīng)用。其實就是這么個理解,被android:persistent修飾的應(yīng)用會在系統(tǒng)啟動之后被AM啟動。

AM首先去PM(PackageManagerService)中去查找設(shè)置了Android:persistent的應(yīng)用

public void systemReady(final Runnable goingCallback) {
  if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
    try {
      List apps = AppGlobals.getPackageManager().
        getPersistentApplications(STOCK_PM_FLAGS);
      if (apps != null) {
        int N = apps.size();
        int i;
        for (i=0; i<N; i++) {
          ApplicationInfo info
            = (ApplicationInfo)apps.get(i);
          if (info != null &&
              !info.packageName.equals("Android")) {
            addAppLocked(info);
          }
        }
      }
    } catch (RemoteException ex) {
      // pm is in same process, this will never happen.
    }
  }
}

假如該被Android:persistent修飾的應(yīng)用此時并未運(yùn)行的話,那么AM將調(diào)用startProcessLocked啟動該app,關(guān)于startProcessLocked不再描述,另外一篇文章《How to start a new process for Android?》中做了詳細(xì)的介紹(這篇英文文檔小編就不翻譯了,感興趣的朋友可以搜到看一看)。

app的啟動過程就是啟動app所在的package對應(yīng)的進(jìn)程。

final ProcessRecord addAppLocked(ApplicationInfo info) {
    ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);
    if (app == null) {
      app = newProcessRecordLocked(null, info, null);
      mProcessNames.put(info.processName, info.uid, app);
      updateLruProcessLocked(app, true, true);
    }
    if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
        == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
      app.persistent = true;
      app.maxAdj = CORE_SERVER_ADJ;
    }
    if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
      mPersistentStartingProcesses.add(app);
      startProcessLocked(app, "added application", app.processName);
    }
    return app;
}

面介紹app所在的package對應(yīng)的進(jìn)程啟動完成之后,app是如何被create的。

從文章《How to start a new process for Android?》中可知,zygote在創(chuàng)建新的進(jìn)程均會啟動它的mainThread android.app.ActivityThread,因此我們從ActivityThread的main函數(shù)中接著分析app的create過程。

在main中有下面這個操作

thread.attach(false);

在attach過程中,ActivityThread會將對應(yīng)的application attach到AM中去,交與AM去管理。這里需要注意一個變量

final ApplicationThread mAppThread = new ApplicationThread();

mAppThread是一個ApplicationThread對象,mAppThread可以看作是當(dāng)前進(jìn)程主線程的核心,它負(fù)責(zé)處理本進(jìn)程與其他進(jìn)程(主要是AM)之間的通信,同時通過attachApplication將mAppThread的代理Binder傳遞給AM。

private final void attach(boolean system) {
    sThreadLocal.set(this);
    mSystemThread = system;
    if (!system) {
      ViewRoot.addFirstDrawHandler(new Runnable() {
        public void run() {
          ensureJitEnabled();
        }
      });
      Android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");
      RuntimeInit.setApplicationObject(mAppThread.asBinder());
      IActivityManager mgr = ActivityManagerNative.getDefault();
      try {
        mgr.attachApplication(mAppThread);
      } catch (RemoteException ex) {
      }
    }
}

上面的attach代碼中,我們順著IPC調(diào)用AM的attachApplication過程再往下看。
在該過程中,AM調(diào)用到了IPC通信調(diào)用mAppThread的bindApplication;

private final boolean attachApplicationLocked(IApplicationThread thread,
  int pid) {
  thread.bindApplication(processName, app.instrumentationInfo != null
      ? app.instrumentationInfo : app.info, providers,
      app.instrumentationClass, app.instrumentationProfileFile,
      app.instrumentationArguments, app.instrumentationWatcher, testMode,
      isRestrictedBackupMode || !normalMode,
      mConfiguration, getCommonServicesLocked());
  updateLruProcessLocked(app, false, true);
  app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();
}

mAppThread的bindApplication再通過消息機(jī)制向ActivityThread自身維護(hù)的handler發(fā)送BIND_APPLICATION消息。下面看看ActivityThread自身維護(hù)的handler對消息BIND_APPLICATION的處理,最終會調(diào)用到handleBindApplication函數(shù)

你會發(fā)現(xiàn)在handleBindApplication函數(shù)中有這么一句

mInstrumentation.callApplicationOnCreate(app);

我們最終在繞了好大一圈之后,調(diào)用了app的onCreate函數(shù)來啟動這個application。

PS:更多關(guān)于AndroidManifest.xml配置項及其功能可參考本站在線工具:

Android Manifest功能與權(quán)限描述大全:
http://tools.jb51.net/table/AndroidManifest

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • 詳解Android控件之DatePicker、TimePicker探究

    詳解Android控件之DatePicker、TimePicker探究

    本篇文章主要介紹了Android控件之DatePicker、TimePicker探究,非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • Android完美實現(xiàn)平滑過渡的ViewPager廣告條

    Android完美實現(xiàn)平滑過渡的ViewPager廣告條

    這篇文章主要為大家詳細(xì)介紹了Android完美實現(xiàn)平滑過渡的ViewPager廣告條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android實現(xiàn)簽名涂鴉手寫板

    Android實現(xiàn)簽名涂鴉手寫板

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)簽名涂鴉手寫板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android編程實現(xiàn)webview將網(wǎng)頁打包成apk的方法

    Android編程實現(xiàn)webview將網(wǎng)頁打包成apk的方法

    這篇文章主要介紹了Android編程實現(xiàn)webview將網(wǎng)頁打包成apk的方法,以打包HTML5為例分析了webview打包apk的相關(guān)方法、屬性與事件操作技巧,需要的朋友可以參考下
    2017-08-08
  • Android實現(xiàn)檢測實體按鍵事件并屏蔽

    Android實現(xiàn)檢測實體按鍵事件并屏蔽

    這篇文章主要介紹了Android實現(xiàn)檢測實體按鍵事件并屏蔽 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android WebView無法加載H5頁面的常見問題和解決方法

    Android WebView無法加載H5頁面的常見問題和解決方法

    Android WebView 是一種視圖組件,使得 Android 應(yīng)用能夠顯示網(wǎng)頁內(nèi)容,它基于 Chromium,具備現(xiàn)代瀏覽器的許多功能,包括支持 HTML5、CSS3 和 JavaScript,本文給大家介紹了Android WebView無法加載H5頁面的常見問題和解決方法,需要的朋友可以參考下
    2025-03-03
  • Material Design系列之Behavior上滑顯示返回頂部按鈕

    Material Design系列之Behavior上滑顯示返回頂部按鈕

    這篇文章主要為大家詳細(xì)介紹了Material Design系列之Behavior上滑顯示返回頂部按鈕的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android自定義日歷控件實例詳解

    Android自定義日歷控件實例詳解

    這篇文章主要為大家詳細(xì)介紹了Android自定義日歷控件的實現(xiàn)過程,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android自定義PasswordInputView密碼輸入

    Android自定義PasswordInputView密碼輸入

    這篇文章主要為大家詳細(xì)介紹了Android自定義PasswordInputView密碼輸入功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Android控件之GridView用法實例分析

    Android控件之GridView用法實例分析

    這篇文章主要介紹了Android控件之GridView用法,通過繪制九宮格的實例形式分析了GridView可滾動網(wǎng)格的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09

最新評論

镇雄县| 南投市| 泊头市| 马边| 乐清市| 江孜县| 即墨市| 吕梁市| 饶河县| 吉隆县| 台东县| 大田县| 玉林市| 得荣县| 定州市| 军事| 枣阳市| 桃江县| 南丹县| 南澳县| 北碚区| 黄陵县| 华池县| 噶尔县| 平江县| 保靖县| 庆云县| 平陆县| 青铜峡市| 仙游县| 伊春市| 贡嘎县| 襄城县| 通河县| 西乌珠穆沁旗| 大石桥市| 葫芦岛市| 翼城县| 海丰县| 克什克腾旗| 新绛县|