Intent对象详解(二)
最后更新于:2022-04-01 16:14:52
**3,Action、Category属性与intent-filter配置**
Intent的Action和Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,Category则用于为Action增加额外的附加类别信息,通常,Action与Category结合使用。
元素里通常可包括如下子元素:
a、0~N个子元素
b、0~N个子元素
c、0~1个子元素
子元素的配置非常简单,它们都可指定android:name属性,该属性的值就是一个普通字符串。
当元素里的子元素里包含多个子元素(相当于指定了多个字符串)时,就表明该Activity能响应Action属性值为其中任意一个字符串的Intent。
一个Intent对象最多只能包括一个Action属性,程序调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可包含多个Category属性,调用Intent的addCategory(String str)方法添加。
当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。
~~~
public class ActionCateAttr extends Activity
{
// 定义一个Action常量
final static String _ACTION =
"com.intent.action._ACTION";
// 定义一个Category常量
final static String _CATEGORY =
"com.intent.category._CATEGORY";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
Intent intent = new Intent();
// 设置Action属性
intent.setAction(ActionCateAttr._ACTION);
// 添加Category属性
intent.addCategory(ActionCateAttr._CATEGORY);
startActivity(intent);
}
});
}
}
~~~
~~~
public class SecondActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
EditText show = (EditText) findViewById(R.id.show);
// 获取该Activity对应的Intent的Action属性
String action = getIntent().getAction();
// 显示Action属性
show.setText("Action为:" + action);
EditText cate = (EditText) findViewById(R.id.cate);
// 获取该Activity对应的Intent的Category属性
Set<String> cates = getIntent().getCategories();
// 显示Action属性
cate.setText("Category属性为:" + cates);
}
}
~~~
Manifest.xml
~~~
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.crazyit.intent"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="17" />
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
<activity android:name=".ActionCateAttr"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"
android:label="@string/app_name">
<intent-filter>
<!-- 指定该Activity能响应action为指定字符串的Intent -->
<action android:name="com.intent.action._ACTION" />
<!-- 指定该Activity能响应category为指定字符串的Intent -->
<category android:name="com.intent.category.CRAZYIT_CATEGORY" />
<!-- 指定该Activity能响应category为android.intent.category.DEFAULT的Intent -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
</manifest>
~~~
**3、Data、Type属性与intent-filter配置**
Data属性通常用于向Action属性提供操作的数据,Data属性接收一个Uri对象,一个Uri对象通常通过如下形式的字符串表示:
content://com.android.contracts/contacts/1
tel:123
上面两个字符串的冒号前面大致指定了数据的类型,冒号后面是数据部分。
Uri字符串总满足如下格式:
scheme://host.port/path
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,当Intent不指定Data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性。
一旦为Intent同时指定Action、Data属性,那么Android将可根据指定的数据类型来启动特定的应用程序,并对指定数据执行相应的操作。下面介绍几个Action、Data属性的组合:
ACTION_VIEW content://com.android.contacts/contacts/1:显示标识为1的联系人的信息
ACTION_EDIT content://com.android.contacts/contacts/1:编辑标识为1的联系人的信息
ACTION_DIAL content://com.android.contacts/contacts/1:显示向标识为1的联系人拨号的界面
ACTION_VIEW tel:123:显示向指定号码123拨号的界面
ACTION_DIAL tel:123:显示向指定号码123拨号的界面
ACTION_VIEW content://contacts/people/:显示所有联系人列表的信息,通过这种组合可以方便地查看系统联系人