Android系统从诞生之初就不允许直接访问4大应用程序组件(Activity,Service,Broadcast Receiver和Content Provider),这就需要提供一种机制可以访问这些组件。
Intent对象被应用于4大基本组件中的3个,而Content Provider会采用其他方式访问。例如,对于窗口(Activity)来说,尽管无法直接访问窗口实例,但可以调用startActivity方法显示窗口。为了可以更灵活地控制窗口,以及向窗口传递数据,就需要一种技术来完成这些工作,这就是Intent的核心功能,也就是说Intent对象从本质上来说就相当于一个信使,用于保存和传输数据。
Intent对象可以封装和传递6种信息。
组件名(Component name)
动作(Action)
种类(Category)
数据(Date)
附加信息(Extra)
标志(Flags)
显示和隐式访问窗口
直接指定窗口类的方式呗称为显示访问窗口。
隐式访问窗口不需要指定窗口类的class,而只是指定与窗口绑定的字符串(Action,Category和Data),至于怎么设置Intent要看AndroidManifest.xml文件中是如何声明的。例如:
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.MYACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
隐式调用MyActivity窗口的代码
Intent intent = new Intent("android.intent.action.MYACTION");
startActivity(intent);
跨程序访问窗口
每一个Android应用的唯一标识就Package Name(包名),也就是按到肉的Manifest.xml文件中< manifest>标签的package属性值。只要Package Name相同,就可以认为是同一个应用。
如果用Intent对象指定一个窗口类,除了指定窗口类的class外,还需要指定窗口类所在的应用程序的Context对象(或应用程序的Package Name),所以通过Package Name和Activity Class Name(窗口类名)可以定位当前Android系统中的任意窗口。