摸鱼学Android 八(意图)
- 意图(Intent)
- 1 说明
- 1.1 意图本身
- 1.2 意图对象
- 1.3 意图类型
- 2 使用
- 3 实例
意图(Intent)
1 说明
1.1 意图本身
意图是一个要执行的操作的抽象描述。
意图本身(一个 Intent 对象)是一个被动的数据结构,保存着要执行操作的抽象描述。
例如,有一个活动,需要打开邮件客户端并通过 Android 设备来发送邮件。为了这个目的,活动需要发送一个带有合适选择器的 ACTION_SEND 到 Android 意图处理者。指定的选择器给定合适的界面来让用户决定如何发送他的邮件数据。
1.2 意图对象
意图对象是一包的信息,用于组件接收到的意图就像 Android 系统接受到的信息。包括如下的组件,具体取决于要通信或者执行什么:
- 动作(Action):这是意图对象中必须的部分,被表现为一个字符串。通过setAction()进行设置,getAction()获取。
- 数据(Data):添加数据规格到意图过滤器。这个规格可以只是一个数据类型(如元类型属性),一条 URI ,或者同时包括数据类型和 URI 。setData()和getData()处理URI数据,setType()和getType处理元类型,setDataAndType()两者皆可。
- 类别(Category):类别是意图中可选的部分,是一个字符串,包含该类型组件需要处理的意图的附加信息。处理方法为addCategory() 、removeCategory()、getCategories() 。
- 附加数据(Extras):这是传递给需要处理意图的组件的以键值对描述的附加信息。通过putExtras()和getExtras()处理。
- 标记(Flag):标记是意图的可选部分,说明Android系统如何来启动活动,启动后如何处理等。
- 组件名称:组件名称对象是一个可选的域,代表活动、服务或者广播接收器类。
1.3 意图类型
意图分为显式意图和隐式意图。
显式意图用于连接应用程序的内部世界,这些意图通过名称指定目标组件,一般用于应用程序内部信息 - 比如一个活动启动一个下属活动或者启动一个兄弟活动。
// 通过指定类名的显式意图
Intent i = new Intent(FirstActivity.this, SecondAcitivity.class);
// 启动目标活动
startActivity(i);
隐式意图没有为目标命名,组件名称的域为空。隐式意图经常用于激活其他应用程序的组件。
Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);
2 使用
- 可以通过 startActivity 来启动一个活动。
- 可以通过broadcastIntent 来发送广播到任何对它感兴趣的广播接受器组件。
- 可以通过startService(Intent) 或者bindService(Intent, ServiceConnection, int) 来与后台服务通讯。
3 实例
- MainActivity.java定义启动浏览器方法和启动电话方法
public void startWeb(View view) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(i);
}
public void startPhone(View view) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("tel:9510300000"));
startActivity(i);
}
- 修改activity_main.xml,添加2个按钮
<Button
android:text="启动浏览器"
android:id="@+id/button"
android:onClick="startWeb"/>
<Button
android:text="启动电话"
android:id="@+id/button2"
android:onClick="startPhone"/>
- 运行程序,依次点击两个按钮 启动浏览器:
启动电话: