Intent:意图分为 显示和隐式 显示比较好理解就不介绍了,这里主要介绍隐式调用intent-filter(隐式意图过滤器)
首先我建立了一个项目,用来验证 项目目录
为了不占太大的篇幅 只贴关键代码
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.intentfiltertest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.intentfiltertest.MainActivity" 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="com.example.intentfiltertest.SecondActivity" android:label="@string/title_activity_second" > <intent-filter> <action android:name="com.action.test1" /><span style="font-family: Arial,Helvetica,sans-serif;"><!--同一个action--></span> <category android:name="android.intent.category.DEFAULT"/><!--必须加上这个,否则会出异常 --> </intent-filter> </activity> <activity android:name="com.example.intentfiltertest.ThirdActivity" android:label="@string/title_activity_third" > <intent-filter> <action android:name="com.action.test1" /> <span style="font-family: Arial,sans-serif;"><!--同一个action --></span> <category android:name="android.intent.category.DEFAULT"/> <category android:name="com.category.test1"/><!--自定义的一个category --> </intent-filter> </activity> </application> </manifest>MainActivity 的关键代码
//跳转SecondActivity 绑定second按钮 public void tosecond(View v) { Intent it = new Intent(); it.setAction("com.action.test1"); it.addCategory("android.intent.category.DEFAULT");//可有可无,就算不写这个,系统也会默认 ,注册文件Manifest中必须填写 ,否则会出异常 startActivity(it); }点击second按钮, ,由于secondActivy和ThirdActivity匹配同一个action:com.action.test1,下面我们把ThirdActivity的category注释掉默认的
<activity android:name="com.example.intentfiltertest.SecondActivity" android:label="@string/title_activity_second" > <intent-filter> <action android:name="com.action.test1" /> <category android:name="android.intent.category.DEFAULT"/><!--必须加上这个,否则会出异常 --> </intent-filter> </activity> <activity android:name="com.example.intentfiltertest.ThirdActivity" android:label="@string/title_activity_third" > <intent-filter> <action android:name="com.action.test1" /> <!-- <category android:name="android.intent.category.DEFAULT"/>--> <category android:name="com.category.test1"/><!--自定义的一个category --> </intent-filter> </activity>点击second按钮
,ThirdActivity没有匹配"android.intent.category.DEFAULT",只有secondActivity匹配。
//跳转ThirdActivity 绑定Third按钮 public void tothird(View v) { try { Intent it = new Intent(); it.setAction("com.action.test1"); it.addCategory("com.category.test1"); startActivity(it); } catch (Exception e) { e.printStackTrace(); } }点击third按钮,无响应,观察后台, 出现异常:android.content.ActivityNotFoundException。哎呀,忘记把注释掉的category,去掉注释了,去掉注释之后
<activity android:name="com.example.intentfiltertest.ThirdActivity" android:label="@string/title_activity_third" > <intent-filter> <action android:name="com.action.test1" /> <category android:name="android.intent.category.DEFAULT"/> <category android:name="com.category.test1"/><!--自定义的一个category --> </intent-filter> </activity>再次点击third按钮,
总结:隐式调用,必须匹配intent-filter(隐式意图过滤器)所有的内容才可以跳到指定的Activity,少于匹配过滤器内容的,会找出所有匹配的。代码中会自动添加默认的category:"android.intent.category.DEFAULT",注册文件不添加默认category就会出异常。自己简单的一个测试,帮助理解一下,当然这里面还有其他的更深入的内容,不过不用测试了,这篇文章,主要是帮助理解一下。