Java 类名.class与类名.this 的区别?

您所在的位置:网站首页 resolveinfo Java 类名.class与类名.this 的区别?

Java 类名.class与类名.this 的区别?

#Java 类名.class与类名.this 的区别?| 来源: 网络整理| 查看: 265

在Android层面上, 粗略见解

Intent intent = new Intent(MainActivity.this, OtherActivity.class);

其实是获得MainActivity.this.getPackageName(),

而在OtherActivity.class, 是获得Class#getName();

假设, 我们是调用Activity#startActivity()方法, 要理解这两个有什么用, 我们跟进一下Android源码,

快速定位到, ActivityManagerService#startActivity(),

再快速定位到, ActivityStackSupervisor#startActivityMayWait(),

找到关键代码,

ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, profileFile, profileFd, userId);

继续看下去,

ResolveInfo rInfo = AppGlobals.getPackageManager().resolveIntent( intent, resolvedType, PackageManager.MATCH_DEFAULT_ONLY | ActivityManagerService.STOCK_PM_FLAGS, userId);

实际上是调用PackageManager的resolveIntent()方法, 从Android的C/S架构, 从代码上, 根据ActivityManagerService命名规则, AppGlobals.getPackageManager()#() resolveIntent就是PackagerManageService#resolveIntent()了, 方法如下,

public ResolveInfo resolveIntent(Intent intent, String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return null; enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "resolve intent"); List query = queryIntentActivities(intent, resolvedType, flags, userId); return chooseBestActivity(intent, resolvedType, flags, query, userId); }

继续跟进下, PackagerManageService#queryIntentActivities()和PackagerManageService#chooseBestActivity(), 可以看出其实根据Intent的mComponent的mPackage和mClass查询与之匹配的ResolveInfo, 看下ResolveInfo类结构, 里面包含了ActivityInfo, 即向PackageManagerServices查询, apk安装之后PackagerManageService维护的AndroidManifest信息了, 回到 ActivityStackSupervisor#resolveActivity()方法, 其实就是为了得到ActivityInfo, 再调用

final int startActivityLocked(IApplicationThread caller, Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,boolean componentSpecified, ActivityRecord[] outActivity)

,把对应的ActivityInfo info传入, 而ActivityInfo包含了theme, launchMode, permission等等等, 即根据ActivityInfo等信息做不同的策略。

由此可见, MainActivity.this是提供了ComponentName#getPackageName()给后面查询对应的ActivityInfo, 而OtherActivity.class则是ComponentName#getClassName()提供给后面查询对应的ActivityInfo, 另外在ActivityThread#performLaunchActivity()启动OtherActivity的时候, 使用ComponentName#getClassName(), 通过反射创建OtherActivity实例。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3