Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加列别的信息。通常Action属性会与Category属性结合使用。

Action要完成的只是一个抽象的动作,这个动作具体由哪个组件(或许是Activity,或许是BroadcastReceiver)来完成,Action这个字符串并不管。比如Android提供的标准Action:Intent.ACTION_VIEW,它只表示一个抽象的查看操作,但具体查看什么、启动哪个Activity来查看,Intent.ACTION_VIEW并不知道——这取决于Activity的<intent-filter.../>配置,只要某个Activity的<intent-filter.../>配置中包含了该ACTION_VIEW,该Activity就有可能被启动。

下面通过一个简单的示例来示范Action属性(就是普通字符串)的作用。下面的程序的第一个Activity非常简单,它只包括一个普通按钮,当用户单击该按钮时,程序会跳转到第二个Activity——但第一个Activity指定跳转的Intent时,并不以“硬编码”的方式指定要跳转的Activity,而是为Intent指定Action属性。

界面布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动第二个Activity"/>
</LinearLayout>

后台代码文件如下:

package com.example.studyintent;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class ActionAttr extends Activity {
//定义一个Action常量
public final static String CRAZYIT_ACTION="com.example.studyintent.action.CRAZYIT_ACTION";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action_attr);
Button bn=(Button)findViewById(R.id.bn);
//为bn按钮绑定事件监听器
bn.setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//创建Intent对象
Intent intent=new Intent();
//为Intent设置Action属性(属性值就是一个普通字符串)
intent.setAction(ActionAttr.CRAZYIT_ACTION);
startActivity(intent);
}}); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.action_attr, menu);
return true;
} }

由于上面的程序指定启动Action属性ActionAttr.CRAZYIT_ACTION常量(常量值为com.example.studyintent.action.CRAZYIT_ACTION)的Activity,也就要求被启动Activity对应的配置元素的<intent-filter.../>元素里至少包括一个如下的<action.../>子元素:

<action android:name="com.example.studyintent.action.CRAZYIT_ACTION"/>

需要指出的是,一个Intent对象最多只能包含一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可调用Intent的addCategory(Stirng str)方法来为Intent添加Category属性。当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。

因此,虽然上面程序的粗体字代码并未指定目标Intent的Category属性,但该Intent已有一个值为android.intent.category.DEFAULT的Category属性值,因此被启动Activity对应的配置元素的<intent-filter.../>元素里至少还包含一个如下的<category.../>子元素:

<category android:name="android.intent.category.DEFAULT" />

下面是被启动Activity的完整配置。

  <activity
android:name="com.example.studyintent.SecondActivity"
android:label="@string/title_activity_second" >
<intent-filter> <!-- 指定该Activity能响应Action为指定字符串的Intent -->
<action android:name="com.example.studyintent.action.CRAZYIT_ACTION" />
<!-- 指定该Activity能响应category为指定字符串的Intent -->
<category android:name="com.example.studyintent.category.CRAZYIT_CATEGORY" />
<!-- 指定该Activity能响应category为android.intent.category.DEFAULT的Intent -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

上面的配置代码中配置了一个实现类为SecondActivity的Activity,因此程序还提供了这个Activity的代码,代码如下:

package com.example.studyintent;

import java.util.Set;

import android.os.Bundle;
import android.app.Activity;
import android.content.ComponentName;
import android.view.Menu;
import android.widget.EditText; public class SecondActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second); EditText show=(EditText)findViewById(R.id.show);
//获取该Activity对应的Intent的Action属性
String action=getIntent().getAction();
//显示Action属性
show.setText("Action为:"+action);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.second, menu);
return true;
} }

上面的程序代码很简单,它只是在启动时把启动该Activity的Intent的Action属性显示在指定文本框内。运行上面的程序并单击程序中的按钮,将看到如图5.2所示界面。

接下来的示例程序将会示范Category属性的用法,该程序的第一个Activity的代码如下。

package com.example.studyintent;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class ActionCateAttr extends Activity {
//定义一个Action常量
final static String CRAZYIT_ACTION="com.example.studyintent.action.CRAZYIT_ACTION";
//定义一个Category常量
final static String CRAZYIT_CATEGORY="com.example.studyintent.category.CRAZYIT_CATEGORY";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action_cate_attr);
Button bn=(Button)findViewById(R.id.bn);
bn.setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
//设置Action属性
intent.setAction(ActionCateAttr.CRAZYIT_ACTION);
//添加Category属性
intent.addCategory(ActionCateAttr.CRAZYIT_CATEGORY);
startActivity(intent);
}});
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.action_cate_attr, menu);
return true;
} }

下面是程序要启动的目标Action所对应的配置代码:

 <activity
android:name="com.example.studyintent.SecondActivity"
android:label="@string/title_activity_second" >
<intent-filter> <!-- 指定该Activity能响应Action为指定字符串的Intent -->
<action android:name="com.example.studyintent.action.CRAZYIT_ACTION" />
<!-- 指定该Activity能响应category为指定字符串的Intent -->
<category android:name="com.example.studyintent.category.CRAZYIT_CATEGORY" />
<!-- 指定该Activity能响应category为android.intent.category.DEFAULT的Intent -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

上面配置Activity时也指定该Activity的实现类为SecondActivity,该实现类的代码如下:

package com.example.studyintent;

import java.util.Set;

import android.os.Bundle;
import android.app.Activity;
import android.content.ComponentName;
import android.view.Menu;
import android.widget.EditText; public class SecondActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_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();
//显示Category属性
cate.setText("Category属性为:"+cates); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.second, menu);
return true;
} }

运行上面程序单击程序中的按钮,将看到如图5.3所示的界面

Intent的属性及Intent-filter配置——Action、Category属性与intent-filter属性的更多相关文章

  1. web.xml之servlet与filter配置

    servlet配置 一个完整的servlet配置分为两块,< servlet >块和< servlet-mapping >块 < servlet > <ser ...

  2. Android开发之隐式Intent中Intent-filter的三个属性-action,category,data

    使用隐式Intent时,需要使用到意图过滤器Intent-filter.Intent-filter含有三个属性:action,category,data.通过这三个属性的组合,可以启动想要启动的act ...

  3. (转)android.intent.action.MAIN与android.intent.category.LAUNCHER

    android.intent.action.MAIN决定应用程序最先启动的Activity android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 在网上看到 ...

  4. 理解android.intent.action.MAIN 与 android.intent.category.LAUNCHER

    刚才看了一下sundy的视频<LLY110426_Android应用程序启动>,里面讲到luncher这个activity通过获取应用程序信息来加载应用程序,显示给用户,其中就是通过一个应 ...

  5. android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解 (转)

    原文地址:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解 作者: 第一种情况:有MAIN,无LAUNCHER,程 ...

  6. android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解

    第一种情况:有MAIN,无LAUNCHER,程序列表中无图标 原因:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里  第二种情况:无MAIN,有LAU ...

  7. Android(java)学习笔记121:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 理解

    先看看网路上的说法: android.intent.action.MAIN决定应用程序最先启动的 Activity android.intent.category.LAUNCHER决定应用程序是否显示 ...

  8. android.intent.action.MAIN与android.intent.category.LAUNCHER

    android.intent.action.MAIN 决定应用程序最先启动的Activity android.intent.category.LAUNCHER 决定应用程序是否显示在程序列表里 在网上 ...

  9. Android(java)学习笔记62:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 理解

    1. 先看看网路上的说法: android.intent.action.MAIN 决定应用程序最先启动的 Activity android.intent.category.LAUNCHER 决定应用程 ...

随机推荐

  1. shell与if相关参数

    [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ ...

  2. android KeyEvent for dot "."

    android连接了4x4的物理按键,需要映射".". 在linux驱动层注册了按键KEY_DOT, 写android的app的时候却没有对应的宏KEYCODE_DOT.只有KEY ...

  3. 一些简单的例子让你在Java中能更好的学习并理解循环结构(1)!

    一.java中流程控制方式采用三种基本流程结构:顺序结构,选择(分支)结构,循环结构. 1.[if-else 结构] if(1>2){ system.out.println("if条件 ...

  4. webapp之路--apple私有属性apple-touch-icon

    以前我们用过favicon在浏览器给网站进行身份标识,用法如下: <link href="http://image.feeliu.com/web/favicon.ico" r ...

  5. 由获取子元素的方法find和children所获

    html代码如下 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://ww ...

  6. (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。

    In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...

  7. MariaDB GTID 复制同步

    MariaDB GTID 复制同步 GTID:Global Transaction ID,全局事务ID,在整个主从复制架构中任何两个事物ID是不能相同的.全局事务ID是Mster服务器生成一个128位 ...

  8. Shell条件与测试

    分类参考 文件状态测试 -b filename 当filename 存在并且是块文件时返回真(返回0) -c filename 当filename 存在并且是字符文件时返回真 -d pathname ...

  9. stm32-ucos移植lwip-1(raw)

    之前在裸机环境下移植了lwip,功能还是很强大的,但是就我看来,这和uip其实差别也不大,其实lwip更强大的功能需要在操作系统之下才能发挥出来,今天就来做这个 首先我们需要移植操作系统,系统选择uc ...

  10. Java中的条件编译(转)

    源:Java中的条件编译 一直以来,不知道怎么在Java中实现像C/C++一样的#ifdef...#endif这样的预编译宏,致使Java代码中一直用if判断,刚好刚才看到了解决办法,记录一下. C/ ...