Android 之PackageManager框架

http://blog.csdn.net/stonecao/article/details/6591454

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中有一个方法:
public PackageManager 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时,实际通过代理对象去执行:
public List<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///
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
return m;
}
--PackageManagerService获取:       
先看前面在ContextImpl.java->getPackagerManager中:    
IPackageManager pm = ActivityThread.getPackageManager();
/ActivityThread
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
就到此为止,11点了,希望大家看过后多留几个脚印,也算是我一晚上辛苦的慰劳,也欢迎大家随时拍砖。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有一个会泰勒级数的八岁表妹是怎样一种体验?

全世界只有3.14 % 的人关注了爆炸吧知识上一篇文章超模君给大家介绍了欧拉公式&#xff0c;很多粉丝问我&#xff1a;八岁表妹明明还是小学生&#xff0c;是怎么知道泰勒级数的意思的?答案其实很简单&#xff0c;这当然和我们全家优秀的基因...不&#xff01;优良的家教有关&a…

限流中间件IpRateLimitMiddleware的使用

前言IpRateLimitMiddleware&#xff08;Github: AspNetCoreRateLimit&#xff09; 是ASPNETCore的一个限流的中间件&#xff0c;用于控制客户端调用API的频次&#xff0c; 如果客户端频繁访问服务器&#xff0c;可以限制它的频率&#xff0c;已降低访问服务器端的压力。或者如果…

Activity之launchMode:singleTop,singleTask与singleInstance

相关内容&#xff0c;可以参见官方网址&#xff1a; http://developer.android.com/guide/components/tasks-and-back-stack.html 如图所示&#xff0c;如果ABC三个Activity的launchMode都是standard&#xff0c;那么按照图示顺序调用后&#xff0c;堆栈为ABCBB&#xff1b; …

傅立叶变换是如何改变我们生活的? ——四个角度告诉你答案

全世界只有3.14 % 的人关注了爆炸吧知识引子&#xff1a;尽管没有微积分那样如雷贯耳的名声&#xff0c;也没有相对论那般独辟蹊径的创新&#xff0c;傅立叶变换却悄悄地潜藏在我们生活中的方方面面&#xff0c;默默地改变着这个世界。对于工科出身的读者而言&#xff0c;傅立叶…

Win11新版右键菜单用不惯?一键切换回Win10经典版!

在 Windows 11 操作系统中&#xff0c;微软对文件资源管理器和应用程序的上下文菜单&#xff08;Context Menu&#xff0c;俗称“右键菜单”&#xff09;进行了现代化改造。Windows 11 新版右键菜单更加简约&#xff0c;并且融入圆角设计&#xff0c;将常用的命令剪切、复制、粘…

MySQL使用详解--根据个人学习总结

1.安装配置 2.启动mysql服务并配置 mysql> \s&#xff08;status也行&#xff09;查看当前服务器状态查看编码状态Server characterset : utf8Db characterset: utf8Client characterset: gbkConn. characterset: gbk修改&#xff1a;---进入配置文件my.ini客户端&#xff1…

送什么给女朋友最致命?

1 啊&#xff0c;原来里面有说明书&#xff08;via.豆瓣哈组&#xff0c;侵删&#xff09;▼2 网友给女朋友准备的惊喜&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 这个泰国小哥的创意真棒&#xff08;via.阿森不是妖怪&#xff0c;侵删&#xff09;▼4 老婆的…

SWF反编译神器ASV2013功能展示(下)

动作脚本菜单动作脚本-查看元件类动作脚本-编辑AS3常量池动作脚本-ASV内部ABC数据浏览器窗口菜单 选项菜单-帧视图选项 选项菜单-预览窗口选项选项菜单-时间线视图选项选项菜单-库视图选项 选项菜单-动作脚本视图选项实用工具菜单 关于对话框 转载于:https://blog.51cto.com/as…

【项目 报错】 项目启动,内存溢出 可能出现的各种报错

内存溢出可能有如下的错误&#xff1a; 错误1&#xff1a; java.lang.OutOfMemoryError: PermGen space 错误2&#xff1a; Exception in thread "http-apr-8080-exec-2" 出现如上的错误&#xff0c;解决方法如下&#xff1a; 1.双击Tomcat 2.点击open launch config…

2021,如何找到适合自己的圈子?

全世界只有3.14 % 的人关注了爆炸吧知识蔡康永分享过这样一段话&#xff1a;“小S的个性本身就是很乐天&#xff0c;很有活力&#xff0c;她这个朋友让我觉得活着是一件很值得、很舒服、很有趣的事。而有的人会让我觉得活着很没劲&#xff0c;碰到他会把我的能量都吸走”。你和…

I/O多路转接之poll——基于TCP协议

1. 函数a. 参数&#xff1a;&#xff08;1&#xff09;fds:是一个struct pollfd结构类型的指针&#xff0c;指向用于存放需要检测状态的Socket描述符&#xff1b;每当调用这个函数之后&#xff0c;系统不会清空这个数组&#xff0c;操作起来比较方便&#xff1b;特别是对于sock…

C# 日志管理框架:Common.Logging和log4net

01—DLL引用‍common logging是一个通用日志接口框架&#xff0c;log4net是一个强大的具体实现框架. common logging可以把输出连接到其他非log类上, 如EntLib的日志、NLog等‍‍‍‍‍‍‍‍‍‍‍‍‍‍项目中需要引入的DLL:Common.Logging.dllCommon.Logging.Core.dllCommon…

我开发了一个对.NET程序进行瘦身的工具

我开发了一个对.Net程序瘦身的工具&#xff0c;可以把被引用但是没有被使用的程序集删除。我用它把一个.Net core程序从147兆瘦身到59.5兆。.NET中发布程序的时候有对程序集进行剪裁的功能&#xff0c;但是那个功能只能做静态检查。比如我们的项目使用了A程序集&#xff0c;A程…

三联竟出了这么赞的杂志!各领域佼佼者畅所欲言,为少年建立思维判断体系!

▲点击查看很多中国小孩的成长是断层的。10岁前被视作可爱稚子&#xff0c;被大人护着走&#xff1b;18岁猛然被定义为成年人&#xff0c;要选择大学、专业&#xff0c;开始面对感情。中间的人生呢&#xff1f;“你是个学生&#xff0c;学习是本职&#xff0c;现在谈什么人生&a…

C# WPF中添加调试信息查看窗体

第一步&#xff1a;添加wpf窗口&#xff1b;第二步&#xff1a;在主窗体image的MouseLeftButtonUp事件中调用调试窗口&#xff1b;StatusViewWindow svWindow new StatusViewWindow();svWindow.Show();第三步&#xff1a;在主窗体中开个线程通过udp接收光电广开的数据&#xf…

杨振宁追求的物理美学,居然在这里实现,物理学史上颜值最高的组合,看完后跪了……

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增...

在mssql数据库中&#xff0c;时间字段如果想使用当前的时间&#xff0c;默认值是 getdate() 在mysql里面&#xff0c;如果是用 datetime类型&#xff0c;值用now() 是不允许的。 修改为 timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间&#xff0c;即可以达到mssql里面…

FirewallD is not running

2019独角兽企业重金招聘Python工程师标准>>> 1.发现安装好tomcat后&#xff0c;发现无法访问tomcat首页&#xff0c;后来发现防火墙没有开放8080端口。 需注意的是&#xff1a;CentOS 7防火墙换用Friewalld了&#xff0c;所以要用以下命令将端口号加进防火墙&#x…

三年租男友回家竟花了10万......

1 不要让别人一天毁了它&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 每天一个单身小技巧&#xff08;via.最佳蹲坑读物&#xff0c;侵删&#xff09;▼3 被封印在木桩里的哆啦A梦&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 大家的对象都是哪里…