美文网首页
创建 Intent 时的误区

创建 Intent 时的误区

作者: 抓兔子的猫 | 来源:发表于2016-05-25 14:12 被阅读95次

关于Intent的基本用法网上很多,就不再赘述,下面讲一个容易理解错的点

我们在构建 Intent对象是最常用的方式是这样

Intent intent =newIntent(this, XXX.class);

this指当前的 activity类,activity 最终继承自 Contenxt,class指目标activity.

也就是调用的这个构造方法

public Intent(Context packageContext, Class cls) {

     mComponent=new ComponentName(packageContext, cls);

}

这里存在的误区就是误以为 第一个Context类型参数就是指的当前 的activity,其实这是不对的

继续从源码分析 new ComponentName(packageContext, cls) 使用的构造函数是这样的

public ComponentName(Context pkg, Class cls) {

           mPackage= pkg.getPackageName();

           mClass= cls.getName();

}

由此可看出,传入的Context的目的是获取一个字符串类型的包名,而这个包名是什么的包名呢?

启动一个新的 Activity 是靠系统级别的 ActivityManager 来操作的,ActivityManager 在获得能够定位具体的 Activity 的信息(应用的包名和目标的完整类名)之后,找到那个 Activity 并实例化它。

这里的报名实际指的是目标类的包名。

引用网友的论证过程

假设结构如下

包:com.package1----》Activity1,Activity2

包:com.package2----》ActivityA,ActivityB

误解: 认为Context是调用方,以前一直在一个包中调用如,package1包中,Activity1调用Activity2,Intent.setClass(this,Activit2)这样不出问题的。

可是如果跨包掉,在Activity1中调用ActivityA,就出现错位了。

结论: Context是被调用方的 , Context得到包名,class得到类名,来唯一确定Activity

相关文章

网友评论

      本文标题:创建 Intent 时的误区

      本文链接:https://www.haomeiwen.com/subject/uzltdttx.html