Android - 使用Intent在活动之间穿梭

2022-04-25 15:37:17 浏览数 (2)

Intent

Intent大致分为两种:显示Intent隐式Intent

显示Intent

Intent有多个构造函数的重载,其中一个 Intent(Context packageContext,Class<?>cls)

  1. 第一个参数要求提供一个启动活动的上下文,
  2. 第二个参数指定要启动的目标活动。

Activity类提供了一个startActivity()方法, 这个方法专门用于启动活动的,他接收一个Intent参数,将构建好的Intent传入。 修改按钮的点击事件:

代码语言:javascript复制
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);

隐式Intent

隐式Intent它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的actioncategory等信息,交由系统分析找出更适合的活动启动。 在<activity>标签下配置<intent-filter>的内容, 指定当前活动能够响应的action 和 category。 添加以下:

代码语言:javascript复制
</activity>
<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.bobo1998.test0420.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

在标签中我们指明了当前活动能够响应的 actioncategory 只有这两个同时匹配上Intent中指定的两个,此活动才响应该Intent。 修改按钮点击事件:

代码语言:javascript复制
Intent intent = new Intent("com.bobo1998.test0422.ACTION_START");
startActivity(intent);

使用了Intent的另一个构造函数,直接将action的字符串传入,表明我们想要启动能够响应com.bobo1998.test0422.ACTION_START 的活动。 标签内指定的category是一种默认的,在调用startActivityg()方法会自动将category添加到Intent中。

每个Intent智能指定一个action,但能指定多个category,按钮内增加一个。

代码语言:javascript复制
Intent intent = new Intent("com.bobo1998.test0422.ACTION_START");
intent.addCategory("com.bobo1998.test0422.MY_CATEGORY");
startActivity(intent);

指定了一个自定义的category,但是程序会崩溃,没有任何一个活动可以响应我们的Intent,因为标签内没有声明响应这个category,所以在标签内添加一个category的声明: <category android:name="com.bobo1998.test0422.MY_CATEGORY"/>

更多隐式Intent的用法

使用隐式Intent不仅可以启动自己程序内的活动,也可以启动其他程序的活动。 修改按钮点击事件:

代码语言:javascript复制
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对象传递进去。 setData(),接收一个Uri对象,主要用于指定当前Intent正在操作的数据,这些数据都是以字符串的形式传入到Uri.parse()方法中解析产生的。

我们还可以在<intent-filter>标签中配置一个标签,用于更精确的指定当前活动能够响应什么类型的数据。 只有标签中指定的内容和Intent中携带的Data完全一致,当前活动才能够响应该Intent。 新建一个活动,标签内配置:

代码语言:javascript复制
<activity android:name=".ThirdActivity"
    android:label="This is ThirdActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http"/>
    </intent-filter>
</activity>

配置了当前活动能够响应的action是android.intent.action.VIEW的常量值, 另外在<data>标签中通过android:scheme指定了数据协议必须是http协议。

我们还可以指定很多其他协议,比如拨号,修改按钮点击事件:

代码语言:javascript复制
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

指定了Intent的action是Intent.ACTION_DIAL 这也是Android系统内置的动作,data部分指定了协议是tel号码是10086

0 人点赞