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-12
Android 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-03
Android中創(chuàng)建快捷方式代碼實(shí)例
這篇文章主要介紹了Android中創(chuàng)建快捷方式代碼實(shí)例,本文分為三個步驟實(shí)現(xiàn),并分別給出對應(yīng)實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04
Flutter 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-11
Android開發(fā)ListView中下拉刷新上拉加載及帶列的橫向滾動實(shí)現(xiàn)方法
這篇文章主要介紹了Android開發(fā)ListView中下拉刷新上拉加載及帶列的橫向滾動實(shí)現(xiàn)方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
Android仿淘寶詳情頁面viewPager滑動到最后一張圖片跳轉(zhuǎn)的功能
需要做一個仿淘寶客戶端ViewPager滑動到最后一頁,再拖動的時候跳到詳情的功能,剛開始我也迷糊了,通過查閱相關(guān)資料發(fā)現(xiàn)有好多種實(shí)現(xiàn)方法,下面小編給大家分享實(shí)例代碼,感興趣的朋友一起看看吧2017-03-03
Android TabHost如何實(shí)現(xiàn)頂部選項卡
這篇文章主要介紹了Android TabHost如何實(shí)現(xiàn)頂部選項卡,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09

