当前位置: 代码迷 >> Android >> Android系列课程之十一:Intents and Intent Filters(二)
  详细解决方案

Android系列课程之十一:Intents and Intent Filters(二)

热度:353   发布时间:2016-05-01 16:36:36.0
Android系列教程之十一:Intents and Intent Filters(二)

接上节继续。。版权所有:飞雪无情,转载请注明出处:http://flysnow.iteye.com/blog/965527

Android开发技术交流群86686524? ??120059404

Android系列教程目录:

  1. Android教程之一:Window下搭建Android开发环境

  2. Android教程之二:Linux下搭建Android开发环境

  3. Android教程之三:第一个Android应用,HelloWorld

  4. Android系列教程之四:Android项目的目录结构

  5. Android系列教程之五:Activity的生命周期

  6. Android系列教程之六:TextView小组件的使用--附带超链接和跑马灯效果

  7. Android系列教程之七:EditText使用详解-包含很多教程上看不到的功能演示

  8. Android系列教程之八:ListView组件的使用

  9. Android系列教程之九:GridView组件的使用

  10. Android系列教程之十:Intents and Intent Filters(一)

?

Category(类别)检测

?类别在<intent-filter>中是通过<category>标记定义的,Category和Action一样,他们的名字都是一个字符串定义,但是我们在代码中可以使用对应的类别常量,在xml文件定义中只能使用定义好的字符串。Android的Intent类中提供了很多内置的类别定义,一中类别代表一个意思,可以参考说明使用。。比如android.intent.category.LAUNCHER标表示你的应用会展示在启动列表页面,经常和android.intent.action.MAIN搭配使用

下面通过一个例子来说明Category的检测,项目名为Intents,应用名为Intents and Filters,运行在Android2.2版本上.主启动Activity为IntentsTestList。

  1. IntentsTestList代码如下:
    /** * Intents测试列表类 * @author 飞雪无情 * @since 2011-3-14 */public class IntentsTestList extends ListActivity {	private String ACTION_VIEW="com.flysnow.intent.ACTION_VIEW";	private String CATEGORY_MAN="com.flysnow.intent.CATEGORY_MAN";	private String CATEGORY_SHOP="com.flysnow.intent.CATEGORY_SHOP";    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);      //定义ListAdapter		setListAdapter(new SimpleAdapter(this, getData(),				android.R.layout.simple_list_item_1, new String[] { "title" },new int[] {android.R.id.text1}));		getListView().setTextFilterEnabled(true);				filter.addCategory(CATEGORY_MAN);		//注册一个广播        super.registerReceiver(new BroadcastReceiver() {						@Override			public void onReceive(Context context, Intent intent) {				Toast.makeText(context, "该Broadcast的Intent Filter设置了Category和Action", Toast.LENGTH_SHORT).show();			}		},filter);    }	@Override	protected void onListItemClick(ListView l, View v, int position, long id) {		Intent intent=(Intent)getData().get(position).get("intent");		Boolean isActivity=(Boolean)getData().get(position).get("isActivity");		if(isActivity){			startActivity(intent);		}else{			sendBroadcast(intent);		}			}	/**	 * 返回ListView需要的数据	 * @return ListView需要的数据	 */	private List<Map<String,Object>> getData() {		List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();		addItem(data, "1个Category检测-Activity", new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN),true);		addItem(data, "1个Category检测-Broadcast", new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN),false);		addItem(data, "2个Category检测-Activity", new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN).addCategory(CATEGORY_SHOP),true);		return data;	}	/**	 * 给ListView添加数据	 * @param data 存储数据的List	 * @param name 要显示的Title	 * @param intent 单击某一项时要启动的Activity	 * @param isActivity 启动的是否是Activity,true是,false为广播	 */	private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) {        Map<String, Object> temp = new HashMap<String, Object>();        temp.put("title", name);        temp.put("intent", intent);        temp.put("isActivity", isActivity);        data.add(temp);    }	private IntentFilter filter=new IntentFilter(ACTION_VIEW);	}
    ?以上代码主要是一个ListView,列出了三个测试项,1个Category的测试和2个Category的测试,注册了一个广播.
  2. 为了测试新建了2个Activity,分别是CategoryActivity和Category2Activity,代码如下:
    /** * @author 飞雪无情 * @since 2011-3-14 */public class CategoryActivity extends Activity {	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		TextView text=new TextView(this);		text.setText("该Activity的Intent Filter值设置了Action和1个Category,不包含android.intent.category.DEFAULT");		setContentView(text);	}	}
    ?
    /** * @author 飞雪无情 * @since 2011-3-14 */public class Category2Activity extends Activity {	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		TextView text=new TextView(this);		text.setText("该Activity的Intent Filter值设置了Action和2个Category,不包含android.intent.category.DEFAULT");		setContentView(text);	}	}
    ?很简单只是一段文字的说明
  3. AndroidManiftest.xml修改如下:
    <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.flysnow.intent"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="8" />    <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".IntentsTestList"                  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=".CategoryActivity" android:label="1个Category检测">        	<intent-filter>        		<action android:name="com.flysnow.intent.ACTION_VIEW"></action>        		<category android:name="android.intent.category.DEFAULT"></category>        		<category android:name="com.flysnow.intent.CATEGORY_MAN"></category>        	</intent-filter>        </activity>         <activity android:name=".Category2Activity" android:label="2个Category检测">        	<intent-filter>        		<action android:name="com.flysnow.intent.ACTION_VIEW"></action>        		<category android:name="android.intent.category.DEFAULT"></category>        		<category android:name="com.flysnow.intent.CATEGORY_MAN"></category>        		<category android:name="com.flysnow.intent.CATEGORY_SHOP"></category>        	</intent-filter>        </activity>    </application></manifest>
    ?为CategoryActivity添加了2个Category,一个是默认的(隐式Intent必须),一个是自定义的。而相应的Category2Activity则有三个Category。
  4. 我们运行测试,效果图如下:

    ?当点击“1个Category检测-Activity”的时候,会弹出

    ?这是,因为我们的Intent定义了一个Category,这个Category在CategoryActivity和Category2Activity里都有,都能匹配上,所以就会弹出这两个Activity供我们选择,而当我们单击《2个Category检测-Activity》的时候就会直接打开Category2Activity,这是因为这个选项里的Intent有2个Category,只有Category2Activity才能匹配上。。。通过例子我们可以总结到:Intent中所包含的所有Category必须在一个组件的intent-filter中有定义,一个都不能少,否则不能通过检测。。但是intent-filter的可以有额外的Category.再次提醒:Android对所有传递给Context.startActivity()的隐式intent至少包含"android.intent.category.DEFAULT"

未完待续

1 楼 banlalaotou 2011-06-15  
我感觉代码再简单一些,对于初学者来说效果会更好。
2 楼 飞雪无情 2011-06-15  
banlalaotou 写道
我感觉代码再简单一些,对于初学者来说效果会更好。

已经很简单了。呵呵
  相关解决方案