没有合适的资源?快使用搜索试试~ 我知道了~
Android中persistent属性用法详解
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
6 下载量 134 浏览量
2020-09-02
02:50:35
上传
评论
收藏 63KB PDF 举报
温馨提示
试读
2页
主要介绍了Android中persistent属性用法,详细分析了persistent属性的功能及相关用法,需要的朋友可以参考下
资源推荐
资源详情
资源评论
Android中中persistent属性用法详解属性用法详解
主要介绍了Android中persistent属性用法,详细分析了persistent属性的功能及相关用法,需要的朋友可以参考下
本文实例讲述了Android中persistent属性用法。分享给大家供大家参考,具体如下:
前段时间在研究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;
}
面介绍app所在的package对应的进程启动完成之后,app是如何被create的。
从文章《How to start a new process for Android?》中可知,zygote在创建新的进程均会启动它的mainThread
android.app.ActivityThread,因此我们从ActivityThread的main函数中接着分析app的create过程。
在main中有下面这个操作
thread.attach(false);
资源评论
weixin_38499503
- 粉丝: 8
- 资源: 975
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功