Android学习第八天——使用 Intent 在活动之间穿梭

1、使用显式 Intent

Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent 一般可被用于启动活动、启动服务、以及发送广播等场景
Intent 的用法大致可以分为两种,显式 Intent 和隐式 Intent:

显式 Intent如何使用

Intent 有多个构造函数的重载,其中一个是 Intent(Context packageContext, Class<?> cls)。这个构造函数接收两个参数,第一个参数 Context 要求提供一个启动活动的上下文,第二个
参数 Class 则是指定想要启动的目标活动,通过这个构造函数就可以构建出 Intent 的“意图”。
Activity 类中提供了一个 startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数,这里我们将构建好的Intent传入startActivity()方法就可以启动目标活动了。
 
在原有的项目下新建一个活动SecondActivity,在second_layout.xml 布局文件中写入下面的代码:
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2 android:layout_width="match_parent"
 3 android:layout_height="match_parent"
 4 android:orientation="vertical" >
 5 <Button
 6 android:id="@+id/button_2"
 7 android:layout_width="match_parent"
 8 android:layout_height="wrap_content"
 9 android:text="Button 2"
10 />
11 </LinearLayout>
 
定义一个按钮用于活动之间的跳转,按钮上显示 Button 2。然后活动 SecondActivity,修改代码如下:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
} }

 

修改 该项目中原活动MainActivity 中按钮的点击事件,代码如下所示:
1 button1.setOnClickListener(new OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 Intent intent = new Intent(MainActivity.this, SecondActivity.class);
5 startActivity(intent);
6 }
7 });
我们首先构建出了一个 Intent,传入 MainActivity.this作为上下文,传入 SecondActivity.class作为目标活动,这样我们的“意图”就非常明显了,即在 MainActivity 这个活动的基础上打
开 SecondActivity 这个活动。然后通过 startActivity()方法来执行这个 Intent
 
                       

 

 

使用隐式 Intent

相比于显式 Intent,隐式 Intent 则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的 action和 category 等信息,然后交由系统去分析这个 Intent,并帮我们找出合适的活动去启动。
 
通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的 action和 category,打开 AndroidManifest.xml,添加如下代码:
1 <activity android:name=".SecondActivity" >
2 <intent-filter>
3 <action android:name="com.example.activitytest.ACTION_START" />
4 <category android:name="android.intent.category.DEFAULT" />
5 </intent-filter>
6 </activity>

 

在<action>标签中我们指明了当前活动可以响应 com.example.activitytest.ACTION_START 这个 action,而<category>标签则包含了一些附加信息,更精确地指明了当前的活动
能够响应的 Intent 中还可能带有的 category。只有<action>和<category>中的内容同时能够匹配上 Intent 中指定的 action 和 category 时,这个活动才能响应该 Intent。
修改 MainActivity 中按钮的点击事件,代码如下所示:
1 button1.setOnClickListener(new OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 Intent intent = new Intent("com.example.activitytest.ACTION_START");
5 startActivity(intent);
6 }
7 });

 

我们使用了 Intent 的另一个构造函数,直接将 action 的字符串传了进去,表明我们想要启动能够响应 com.example.activitytest.ACTION_START 这个 action 的活动
 
<action>和<category>同时匹配上才能响应,但却没有指定category ,这是因为 android.intent.category.DEFAULT 是一种默认的 category,在调用startActivity()方法的时候会自动将这个 category 添加到 Intent 中。
 
每个 Intent 中只能指定一个 action,但却能指定多个 category。
 
 

更多隐式 Intent 的用法

使用隐式 Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得 Android 多个应用程序之间的功能共享成为了可能。比如说你的应用程序中需要展示
一个网页,这时你没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用系统的浏览器来打开这个网页就行了
修改 MainActivity 中按钮点击事件的代码,如下所示:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
这里我们首先指定了 Intent 的 action 是 Intent.ACTION_VIEW,这是一个 Android 系统内置的动作,其常量值为 android.intent.action.VIEW。然后通过 Uri.parse()方法,将一个网址字符串解析成一个 Uri 对象,再调用 Intent 的 setData()方法将这个 Uri 对象传递进去。重新运行程序,在 FirstActivity 界面点击按钮就可以看到打开了系统浏览器

 

 

与此对应,我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置以下内容。
1. android:scheme
用于指定数据的协议部分,如上例中的 http 部分。
2. android:host
用于指定数据的主机名部分,如上例中的 www.baidu.com 部分。
3. android:port
用于指定数据的端口部分,一般紧随在主机名之后。
4. android:path
用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
5. android:mimeType

 

 

 

 

posted on 2021-01-24 20:53  桑榆非晚柠月如风  阅读(23)  评论(0编辑  收藏  举报