Android中persistent屬性用法詳解
本文實(shí)例講述了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)用。其實(shí)就是這么個理解,被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è)計有所幫助。
- Android源碼系列之深入理解ImageView的ScaleType屬性
- Android EditText常用屬性功能匯總
- Android中LinearLayout布局的常用屬性總結(jié)
- 圖文講解Android的ImageView類中的ScaleType屬性設(shè)置
- 詳解Android自定義控件屬性TypedArray以及attrs
- Android開發(fā)之使用ExifInterface獲取拍照后的圖片屬性
- Android編程開發(fā)之EditText中inputType屬性小結(jié)
- Android編程開發(fā)之TextView文字顯示和修改方法(附TextView屬性介紹)
- Android中的windowSoftInputMode屬性詳解
- 淺析Android中的visibility屬性
- android教程之intent的action屬性使用示例(intent發(fā)短信)
- android ListView 一些重要屬性詳解
相關(guān)文章
Android判斷11位手機(jī)號碼的方法(正則表達(dá)式)
項目里頭需要做一個判斷用戶輸入的號碼是否是正確的手機(jī)號碼,正確的手機(jī)號碼應(yīng)該是11位的,這里我們需要用一個正則表達(dá)式來進(jìn)行判斷,下面我把寫法分享給大家2016-12-12Android App的運(yùn)行環(huán)境及Android系統(tǒng)架構(gòu)概覽
這篇文章主要介紹了Android App的運(yùn)行環(huán)境及Android系統(tǒng)架構(gòu)概覽,并對應(yīng)用程序進(jìn)程間隔離機(jī)制等知識點(diǎn)作了介紹,需要的朋友可以參考下2016-03-03Android中創(chuàng)建快捷方式代碼實(shí)例
這篇文章主要介紹了Android中創(chuàng)建快捷方式代碼實(shí)例,本文分為三個步驟實(shí)現(xiàn),并分別給出對應(yīng)實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04Flutter Widget開發(fā)Shortcuts快捷鍵實(shí)例
這篇文章主要為大家介紹了Flutter Widget開發(fā)Shortcuts快捷鍵實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12解決Android 6.0獲取wifi Mac地址為02:00:00:00:00:00問題
這篇文章主要介紹了Android 6.0獲取wifi Mac地址為02:00:00:00:00:00的解決方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11Android開發(fā)ListView中下拉刷新上拉加載及帶列的橫向滾動實(shí)現(xiàn)方法
這篇文章主要介紹了Android開發(fā)ListView中下拉刷新上拉加載及帶列的橫向滾動實(shí)現(xiàn)方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07Android仿淘寶詳情頁面viewPager滑動到最后一張圖片跳轉(zhuǎn)的功能
需要做一個仿淘寶客戶端ViewPager滑動到最后一頁,再拖動的時候跳到詳情的功能,剛開始我也迷糊了,通過查閱相關(guān)資料發(fā)現(xiàn)有好多種實(shí)現(xiàn)方法,下面小編給大家分享實(shí)例代碼,感興趣的朋友一起看看吧2017-03-03Android TabHost如何實(shí)現(xiàn)頂部選項卡
這篇文章主要介紹了Android TabHost如何實(shí)現(xiàn)頂部選項卡,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09