Intent :英文翻译为“意图”
含义也差不多,可以理解为要启动一个或者另一个Activity的“意图”。
当然,启动一个Activity首先需要new Intent();
随后使用startActivity(Intent);
来启动这个Activity
Intent 给我们提供了以下几种构造方法。
public Intent(Context packageContext, Class<?> cls)
public Intent(String action, Uri uri)
public Intent(String action)
public Intent(String action, Uri uri, Context packageContext, Class<?> cls)
第一个构造方法:显式调用
Context : 给定启动Activity的上下文
Class : 需要启动的Activity(显示指定的Activity)
例如: 我们要在MainActivity中启动Target Activity
Intent intent = new Intent(MainActivity.this, TargetActivity.class);
startActivity(intent);
第二和第三个构造皆为隐式调用
action : 为AndroidManifest.xml
中注册的Activity
里的intent-filter
中指定的action
注 : 使用隐式调用同时需要action
和category
同时匹配上才能调用成功。
隐式调用需要进行如下配置
<intent-filter>
<!-- action android:name里的值可以自定义-->
<action android:name="com.sun.scarecrow.ACTION_TEST"/>
<category android:name="android.intent.category.DEFAULT"/>
<!-- category android:name里的值可以自定义-->
<category android:name="com.sun.scarecrow.CATEGORY_TEST"/>
</intent-filter>
使用:每个intent只能指定要给action,但却能指定多个category
Intent intent= new Intent("com.sun.scarecrow.ACTION_TEST");
intent.addCategory("com.sun.scarecrow.CATEGORY_TEST");
注: 因为android.intent.category.DEFAULT
为默认的categoriesgory,在调用start Activity()
的时候会自动将这个category添加到intent中。
所以如果没有自定义的category的时候可以省略intent.addCategory();
。但是xml中的默认category是必须的,不能省略。一旦缺失将不符合隐式匹配规则(* 只有<action>和<category>同时匹配上才能正常响应
*)。
将会出现如下异常:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.sun.scarecrow.ACTION_TEST cat=[com.sun.scarecrow.CATEGORY_TEST] }