加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Android persistent属性分析

发布时间:2021-11-25 18:48:53 所属栏目:教程 来源:互联网
导读:前段时间在研究telephony时,一直没有在framework下发现对telephony的初始化(PhoneFactory.java中的makeDefaultPhones函数)的调用。结果全局搜索之后发现在application PhoneApp(packages/apps/Phone)中调用了。但是application PhoneApp既没有被Broadcast唤

前段时间在研究telephony时,一直没有在framework下发现对telephony的初始化(PhoneFactory.java中的makeDefaultPhones函数)的调用。结果全局搜索之后发现在application PhoneApp(packages/apps/Phone)中调用了。但是application PhoneApp既没有被Broadcast唤醒,也没有被其他service调用,那么是Android是通过什么方式来启动PhoneApp,所以就发现了属性android:persistent。
 
在AndroidManifest.xml定义中,application有这么一个属性android:persistent,根据字面意思来理解就是说该应用是可持久的,也即是常驻的应用。其实就是这么个理解,被android:persistent修饰的应用会在系统启动之后被AM启动。
 
AM首先去PM(PackageManagerService)中去查找设置了android:persistent的应用。
 
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修饰的应用此时并未运行的话,那么AM将调用startProcessLocked启动该app,关于startProcessLocked不再描述,另外一篇文章《How to start a new process for Android?》中做了详细的介绍。
 
app的启动过程就是启动app所在的package对应的进程。
 
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;  
    }  
 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读