获取 PackageManager
PackageManager pm=context.getPackageManager();
像 Activity 这种的的context的实现类的 ContextImpl
public PackageManager getPackageManager(){
if(mPackageManager !=null){
return mPackageManager;
}
IPackageManager pm = ActivityThread.getPackageManager();
if(pm != null){
return (mPackageManager = new ApplicationPackageManager(this, pm));
}
return null;
}
ActivityThread.java
public static IPackageManager getPackageManager(){
if(sPackageManager != null){
return sPackageManager;
}
IBinder b = ServiceManager.getService("package");
sPackageManager = IPackageManager.Stub.asInterface(b);
return sPackageManager;
}
综上可以得知,PackageManager也是采用的 IBinder 进行通信,客户端保存了一个远程 BinderProxy,并且利用 ApplicationPackageManager(extends PackageManager )进行了封装,提供给用户使用,Application 层底层的通信还是通过其ApplicationPackageManager 保存的 BinderProxy 进行通信的。所有的逻辑都会转给 系统进程的PackageManagerService 处理。
网友评论