Intent Filter

Intent分为显示和隐式

显示Intent:通过指定组件的名称来调用,通常用于同一个应用程序的内部组件的启动

隐式Intent:不通过指定组件的名称调用,通常用action和categroy过滤,这种方法往往用于启动其他应用的组件,同时也可以减少代码的耦合度


一个没有intent filters的组件只能收到显式调用,有intent filters的2种调用都能收到。intent filter通常在清单文件中设置。

        <activity
            android:name=".Activity1"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="test.intent.activity1" />
                
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

一个intent filter拥有1个或以上的acton和category。android系统默认每个组件都有
android.intent.category.DEFAULT

这个category,如果不设置的话通过intent启动这个组件时会报android.content.ActivityNotFoundException: No Activity found to handle Intent的错误。

以上的activity可以通过以下代码启动:

		    	Intent intent = new Intent();
		    	intent.setAction("test.intent.activity1");
		    	startActivity(intent);
Activity2:

        <activity
            android:name=".Activity2"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="test.intent.activity2" />
                <category android:name="android.intent.category.DEFAULT" />
                
                <category android:name="test.intent.activity2" />
                <category android:name="test.intent.activity2_1" />
            </intent-filter>
        </activity>
可以通过以下代码启动:

		    	Intent intent = new Intent();
		    	intent.setAction("test.intent.activity2");
		    	intent.addCategory("test.intent.activity2");
		    	startActivity(intent);

ps:比较常用的,返回home界面的代码:

		    	Intent intent = new Intent(Intent.ACTION_MAIN, null);
		    	intent.addCategory(Intent.CATEGORY_HOME);
		    	startActivity(intent);
如果不希望使用默认的home界面,可以自己修改,使得想要的activity成为home界面

        <activity
            android:name=".Activity2"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="test.intent.activity2" />
                 <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>



PackageManager是一个很重要的类,可以利用它根据一些条件过滤intent,以启动符合条件的组件。

下面的代码找出所有应用程序的初始启动activtiy

		    	Intent intent = new Intent(Intent.ACTION_MAIN, null);
		    	intent.addCategory(Intent.CATEGORY_LAUNCHER);
		    	PackageManager pm = getPackageManager();
		    	List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
		    	for (ResolveInfo i:list) {
		    		Log.v("test", i.toString());
		    		String packageName = i.activityInfo.packageName;
		    		String className = i.activityInfo.name;
		    		Log.v("test", packageName+"."+className);
		    	}

效果如图:

Intent Filter_第1张图片



你可能感兴趣的:(Intent Filter)