关于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