懂得 new Intent(Context, Class)
理解 new Intent(Context, Class)
Intent 有一个构造方法是 Intent(Context, Class),初看不太容易明白第一个参数的作用。第二个参数倒是好猜测,就是用来实例化一个新组件呗。
翻了翻文档,发现文档里对第一个参数 Context 的解释是用于获得 package name,以便找到第二个参数 Class 的位置。这下更费解了,既然把 Class 传递进去了,为什么还要通过 Context 来找它?这不是多此一举么?
再接着我翻了源代码,Intent 这个构造方法的实现只有一句代码:
而这个 ComponentName 的构造方法是这样的:
完了。完全搞不明白这是在干嘛,传进来两个对象,结果只保留了从它们当中取出来的字符串,其它信息全都丢弃了……
最后翻了一下书,才算搞明白:即便在同一个应用当中,启动新的 Activity 也是靠系统级别的 ActivityManager 来操作的,ActivityManager 在获得能够定位具体的 Activity 的信息(应用的包名和目标的完整类名)之后,找到那个 Activity 并实例化它。实际上,之前对第二个参数作用的猜测都是错的。
Intent 有一个构造方法是 Intent(Context, Class),初看不太容易明白第一个参数的作用。第二个参数倒是好猜测,就是用来实例化一个新组件呗。
翻了翻文档,发现文档里对第一个参数 Context 的解释是用于获得 package name,以便找到第二个参数 Class 的位置。这下更费解了,既然把 Class 传递进去了,为什么还要通过 Context 来找它?这不是多此一举么?
再接着我翻了源代码,Intent 这个构造方法的实现只有一句代码:
mComponent = new ComponentName(packageContext, cls);
而这个 ComponentName 的构造方法是这样的:
public ComponentName(Context pkg, Class<?> cls) { mPackage = pkg.getPackageName(); mClass = cls.getName(); }
完了。完全搞不明白这是在干嘛,传进来两个对象,结果只保留了从它们当中取出来的字符串,其它信息全都丢弃了……
最后翻了一下书,才算搞明白:即便在同一个应用当中,启动新的 Activity 也是靠系统级别的 ActivityManager 来操作的,ActivityManager 在获得能够定位具体的 Activity 的信息(应用的包名和目标的完整类名)之后,找到那个 Activity 并实例化它。实际上,之前对第二个参数作用的猜测都是错的。