一、隐式Intent
相比较于显式Intent,隐式Intent就含蓄许多了,它并不明确指出我们想要启动的活动,而是通过设置action和category等一系列抽象的信息,交由操作系统去分析这个Intent并帮我们找出合适的活动启动。从我们知道通过AndroidStudio创建第一个活动的时候AndroidManifest.xml文件<activity>标签下会自动配置<intent-filter>中的内容为:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
这里相当于使用了隐式Intent,作为主活动,由操作系统启动的。这里<action>和<category>组成了一个Intent过滤器,只有完全匹配才能启动该活动。
<action>
在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。
<category>
在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。
创建第一个活动时,AndroidStudio会帮我们设置好上述两个标签的内容,但是我们也可以自定义自己的Intent过滤器,只要修改<intent-filter>下若干标签内容即可。
不管是显式intent和隐式Intent工作原理都是一样的,功能也都一样,下图是Intent启动活动的工作原理:
二、隐式Intent的使用
在AndroidStudio上创建FirstActivity作为主活动,再新建一个SecondActivity活动作为被启动的活动,添加如下代码:
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
这里我们自定义了Intent接受的操作和Intent的类型。现在只有<action>和<category>中的内容完全和Intent指定的<action>和<category>匹配才能启动SecondActivity这个活动。在FirstActivity中添加一个按钮并修改按钮点击的事件方法,代码如下:
Button button1 = (Button)findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
可以看到我们使用了Intent的另外一个构造函数,直接将action的字符串传入进去,表明我们想要启动能够响应com.ezample.activitytest.ACTION_START这个action的活动,同时我们指定了一个自定义的category,值为com.example.activitytest.MY_CATEGORY。编译运行程序,点击按钮就会启动SecondActivity这个活动了。