PackageManager框架 perl package manager

1.接着前面讲的ActivityManager框架,继续说一下系统另一个重要的框架,PackagerManager
同样先看一下静态类结构图:


大部分情况我们是在Activity中使用getPackageManager方法获取一个ApplicationPackageManager的对象,ApplicationPackageManager实际上是包装了一个IPackageManager.Stub.Proxy的对象
由IPackageManager.Stub.Proxy代理执行PackageManager相关操作,IPackageManager.Stub.Proxy实际代理的是PackageManagerService,
2.看了前面说的,可能你有点晕,我们再来重新理一下:
首先是IPackageManager是通过IPackageManager.aidl文件生成,同时生成了存根类IPackageManager.Stub,代理类:IPackageManager.Stub.Proxy
这个是packageManager进程通信的基本框架,我前面blog有说,不多加说明了
然后PackageManagerService,它继承了IPackageManager.Stub,它作为PackageManager动作的实际执行者,在system_process中存在
再是我们用户应用程序中的ApplicationPackageManager,先看它如何被获取的:
ContextImpl.java中有一个方法:
publicPackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageManager;
}

IPackageManager pm = ActivityThread.getPackageManager();
if (pm != null) {
// Doesn't matter if we make more than one instance.
return (mPackageManager = new ApplicationPackageManager(this,pm));
}

return null;
}
ApplicationPackageManager实际上是包装了一个IPackageManager对象(IPackageManager.Stub.Proxy),当我们调用queryIntentActivities时,实际通过代理对象去执行:
publicList<ResolveInfo>queryIntentActivities(Intent intent,
int flags) {
try {
return mPM.queryIntentActivities(//mPM是IPackageManager.Stub.Proxy对象
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
flags);
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
进过进程通信,在PackageManagerService执行对应操作:
3.PackageManagerService的构建与获取
--PackageManagerService的构建:在system_process进程加载时,PackageManagerService被构建,在SystemServer.ServerThread.run中有如下一段代码,它就是加载PackageManagerService的:
Slog.i(TAG, "Package Manager");
pm = PackageManagerService.main(context,
factoryTest != SystemServer.FACTORY_TEST_OFF);//启动PackageManagerService
///////////////////////PackageManagerService///////////////////////////////////////////////////////////////////////////
publicstatic final IPackageManager main(Context context, booleanfactoryTest) {
PackageManagerService m = new PackageManagerService(context,factoryTest);
ServiceManager.addService("package", m);
return m;
}
--PackageManagerService获取:
先看前面在ContextImpl.java->getPackagerManager中:
IPackageManager pm = ActivityThread.getPackageManager();
PackageManager框架 perl package manager
/////////////////////ActivityThrea d////////////////
public static IPackageManager getPackageManager() {
if (sPackageManager != null) {
//Slog.v("PackageManager", "returning cur default = " +sPackageManager);
return sPackageManager;
}
IBinder b = ServiceManager.getService("package");
//Slog.v("PackageManager", "default service binder = " + b);
sPackageManager = IPackageManager.Stub.asInterface(b);
//Slog.v("PackageManager", "default service = " +sPackageManager);
return sPackageManager;
}
从ServiceManager中获取的服务pakager,该服务在.PackageManagerService的构建时被注册到ServiceManager中的,ServiceManager机制暂时没有深入了解,后面再发blog专门说一下ServiceManager

  

爱华网本文地址 » http://www.413yy.cn/a/25101014/232828.html

更多阅读

网页中的框架应用详解 spring框架详解

框架标记<frameset>??? 在HTML中,使用框架标记<frameset>可以将一个窗口分割成儿个子窗口,以便在每个窗口中同时显示几个不同的HTML文件。??? 框架结构的文件格式与一般的HTML文件类似,只是将<frameset>标记代替了<body>标记,它不包含具

怎么在word中添加箭头等框架流程符号? 精 流程图箭头

怎么在word中添加箭头等框架流程符号? 精——简介办公过程中经常会使用WORD工具制作文本,初入职场的你还在简单敲一堆又一堆的字儿就上交领导吗?怎样让你的文本更生动立体呢?今天小编给大家分享一下,在word文档中添加箭头框架等流程符号

神级团队框架插件:Grid设置图片攻略

神级团队框架插件:Grid设置图片攻略神级团队框架插件:Grid设置图片攻略——步骤/方法神级团队框架插件:Grid设置图片攻略 1、 这是一个简易的使用手册,也许还会持续更新GRID其他牧师用模块的说明.神级团队框架插件:Grid设置图片攻略 2

PackageInfo、ResolveInfo package info

首先我们来看一下PackageItemInfo,它是包含了一些信息的基类,它的直接子类有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermissionGroupInfo、PermissionInfo。 它的间接子类有:ActivityInfo、ProviderInfo、ServiceInf

声明:《PackageManager框架 perl package manager》为网友硪昰誰分享!如侵犯到您的合法权益请联系我们删除