Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个结构器:
ComponentName(String pkg,String cls)
创建pkg所在包下的cls类所对应的组件。ComponentName(Context pkg,String cls)
创建pkg所对应的包下的cls类所对应的组件。ComponentName(Context pkg,Class< ? > cls)
创建pkg所对应的包下的cls类所对应的组件。
上面构造器的本质就是一个,这说明创建一个ComponentName需要制定包名和类名——这就可唯一地确定一个组件类,这样应用程序即可根据给定的组件类去启动特定的组件。
除此之外,Intent还包含了如下三个方法:
- setClass(Context packageContext,Class< ? > cls):
设置Intent将要启动的组件对应的类。 - setClassName(Context packageContext,String className):
设置Intent将要启动的组件对应的类。 - setClassName(String packageName,String className):
设置Intent将要启动的组件对应的类。
Android应用的Context代表了访问该应用环境信息的接口,而Android应用的包名则作为应用的唯一标识,因此Android应用的Context对象与该应用的包名有一一对应的关系。上面三个setClass()方法就是指定了包名(分别通过Context指定或String指定)和组件的实现类(分别通过Class指定或String指定)。
指定了Component属性的Intent已经明确了它将要启动哪个组件,因此这种Intent也被称为显式Intent,没有指定Component属性的Intent被称为隐式Intent——隐式Intent没有明确指定要启动哪个组件,应用将根据Intent指定的规则去启动符合条件的组件,但具体是哪个组件则不确定。
页面跳转的代码已经熟的可以盲打了:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
实际上,这是Intent提供的一个简化的显式构造器,它是由以下演变而来:
ComponentName comp = new ComponentName(MainActivity.this,SecondActivity.class);
Intent intent = new Intent();
intent.setComponent(comp);
startActivity(intent);
当程序通过Intent的Component属性(明确了启动哪个组件)启动特定组件时,被启动组件几乎不需要使用< intent-filter …/>元素进行配置。
获取当前Activity对应的Intent的Component属性的包名、类名:
ComponentName componentName = getIntent().getComponent();
componentName.getPackageName();
componentName.getClassName();