Android中persistent属性用法详解

更新时间:2023-05-23 12:36:42 阅读: 评论:0

Android中persistent属性⽤法详解
小鱼缸适合养什么鱼>团结的歌曲本⽂实例讲述了Android中persistent属性⽤法。分享给⼤家供⼤家参考,具体如下:
前段时间在研究telephony时,⼀直没有在framework下发现对telephony的初始化(PhoneFactory.Java中的makeDefaultPhones函数)的调⽤。结果全局搜索之后发现在application PhoneApp(packages/apps/Phone)中调⽤了。但是application PhoneApp既没有被Broadcast唤醒,也没有被其他rvice调⽤,那么是Android是通过什么⽅式来启动PhoneApp,所以就发现了属性android:persistent。
在l定义中,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 = PackageManager().
getPersistentApplications(STOCK_PM_FLAGS);
if (apps != null) {
int N = apps.size();
int i;
for (i=0; i<N; i++) {
ApplicationInfo info
= ((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 && mPersistentStartingProcess.indexOf(app) < 0) {
mPersistentStartingProcess.add(app);
startProcessLocked(app, "added application", app.processName);
}
return app;
}
⾯介绍app所在的package对应的进程启动完成之后,app是如何被create的。
从⽂章《How to start a new process for Android?》中可知,zygote在创建新的进程均会启动它的mainThread
android.app.ActivityThread,因此我们从ActivityThread的main函数中接着分析app的create过程。
在main中有下⾯这个操作
thread.attach(fal);
在attach过程中,ActivityThread会将对应的application attach到AM中去,交与AM去管理。这⾥需要注意⼀个变量
final ApplicationThread mAppThread = new ApplicationThread();
mAppThread是⼀个ApplicationThread对象,mAppThread可以看作是当前进程主线程的核⼼,它负责处理本进程与其他进程(主要是AM)之间的通信,同时通过attachApplication将mAppThread的代理Binder传递给AM。
private final void attach(boolean system) {
sThreadLocal.t(this);
mSystemThread = system;
if (!system) {
ViewRoot.addFirstDrawHandler(new Runnable() {
public void run() {
ensureJitEnabled();
石榴简笔画}
});
Android.ddm.DdmHandleAppName.tAppName("<pre-initialized>");
RuntimeInit.tApplicationObject(mAppThread.asBinder());
IActivityManager mgr = Default();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
}
}
}
上⾯的attach代码中,我们顺着IPC调⽤AM的attachApplication过程再往下看。
在该过程中,AM调⽤到了IPC通信调⽤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, fal, true);
app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();
}
mAppThread的bindApplication再通过消息机制向ActivityThread⾃⾝维护的handler发送BIND_APPLICATION消息。下⾯看看ActivityThread⾃⾝维护的handler对消息BIND_APPLICATION的处理,最终会调⽤到handleBindApplication函数
你会发现在handleBindApplication函数中有这么⼀句
mInstrumentation.callApplicationOnCreate(app);
翻转课堂我们最终在绕了好⼤⼀圈之后,调⽤了app的onCreate函数来启动这个application。
PS:更多关于l配置项及其功能可参考本站在线⼯具:
更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》
及《》
希望本⽂所述对⼤家Android程序设计有所帮助。

本文发布于:2023-05-23 12:36:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/925036.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进程   启动   感兴趣
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图