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);
		    	}

效果如图:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值