Intent分为两大类:
(1)显性的(Explicit)
(2)隐性的(Implicit)
对于隐性意图,在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦的目的.(在模块间的组件启动)
intent定位事件的目的地:
(1)种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。
(2)类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。
(3)组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。
(4)附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。
对于显性Intent:
//ComponentName comp = new ComponentName(FirstActivity.this, SecondActivity.class);
1 // 明确的指定了待启动的组件类, 此时的Intent属于显式intent 2 Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
对于隐性Intent,分几步:
(1) 在清单文件中的application节点下的activity下添加intent-fileter,添加action:
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.sample.student.query.number" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="studentNumber" /> </intent-filter> </activity>
<activity android:name=".OtherActivity"> <intent-filter > <action android:name="com.sample.student.other"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="student" android:host="www.student.com" android:port="8080"/> <data android:scheme="other"/> <data android:mimeType="text/*" /> </intent-filter> </activity>
(2)
1 // action 2 private final String studentQueryIntent = "com.sample.student.query.number"; 3 // data 4 Uri studentNumberUri = Uri.parse("student:12"); 5 Intent intent = new Intent(); 6 intent.setAction(studentQueryIntent); 7 intent.setData(studentNumberUri); 8 startActivity(intent);
Intent intent = new Intent(); intent.setAction("com.sample.student.other"); Uri data = Uri.parse("student://www.student.com:8080"); //intent.setData(data); intent.setDataAndType(data, "text/*"); startActivity(intent);
其中setData方法:
1 //注:setData、setDataAndType、setType 这三种方法只能单独使用,不可共用。 2 //要么单独以 setData 方法设置 URI 3 intent.setData(uri); 4 //如何在<data>中多了一个android:mimeType="text/*", 此时不能使用intent.setData, 而要使用intent.setDataAndType(); 5 intent.setDataAndType(uri, "text/plain"); 6 //要么单独以 setDataAndType 方法设置 Type 7 intent.setType("text/plain");
设置了多个data,只要匹配一个就可以启动这个activity。
如果设置了 <data android:scheme="student" android:host="www.student.com" android:path="/studentNum" android:port="8080"/>,必须完全匹配 Uri data = Uri.parse("student://www.student.com:8080/studentNum");才能启动。
如果 <data android:scheme="student" android:host="www.student.com"/>,那么 Uri data = Uri.parse("student://www.student.com:80"),Uri data = Uri.parse("student://www.student.com:8800"), Uri data = Uri.parse("student://www.student.com") 都可以匹配。
如果只设置了 <data android:scheme="student"/>,那么 Uri data = Uri.parse("test://") 就可以匹配,后面也可以加其他参数。
如果设置了mimeType,那么必须使用 intent.setDataAndType(data, "text/*"); 启动activity。
对于<intent-filter>中的action项可以有多个只要匹配其中一个就可以了。
隐性Intent:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。