第一行代码:Android(2nd ed)(31):先从看得到的入手——探究活动 2.3.2

阅读数:57 2019 年 10 月 19 日 13:34

第一行代码:Android(2nd ed)(31):先从看得到的入手——探究活动 2.3.2

(使用 Intent 在活动之间穿梭:使用隐式 Intent)

相比于显式 Intent,隐式 Intent 则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的actioncategory等信息,然后交由系统去分析这个 Intent,并帮我们找出合适的活动去启动。

什么叫作合适的活动呢?简单来说就是可以响应我们这个隐式 Intent 的活动,那么目前 SecondActivity 可以响应什么样的隐式 Intent 呢?额,现在好像还什么都响应不了,不过很快就会有了。

通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的actioncategory,打开 AndroidManifest.xml,添加如下代码:

复制代码
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

<action>标签中我们指明了当前活动可以响应com.example.activitytest.ACTION_START这个action,而<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的 Intent 中还可能带有的category。只有<action><category>中的内容同时能够匹配上 Intent 中指定的actioncategory时,这个活动才能响应该 Intent。

修改 FirstActivity 中按钮的点击事件,代码如下所示:

复制代码
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});

可以看到,我们使用了 Intent 的另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应com.example.activitytest.ACTION_START这个action的活动。那前面不是说要<action><category>同时匹配上才能响应的吗?怎么没看到哪里有指定category呢?这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到 Intent 中。

重新运行程序,在 FirstActivity 的界面点击一下按钮,你同样成功启动 SecondActivity 了。不同的是,这次你是使用了隐式 Intent 的方式来启动的,说明我们在<activity>标签下配置的actioncategory的内容已经生效了!

每个 Intent 中只能指定一个action,但却能指定多个category。目前我们的 Intent 中只有一个默认的category,那么现在再来增加一个吧。

修改 FirstActivity 中按钮的点击事件,代码如下所示:

复制代码
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});

可以调用 Intent 中的addCategory()方法来添加一个category,这里我们指定了一个自定义的category,值为com.example.activitytest.MY_CATEGORY

现在重新运行程序,在 FirstActivity 的界面点击一下按钮,你会发现,程序崩溃了!这是你第一次遇到程序崩溃,可能会有些束手无策。别紧张,其实大多数的崩溃问题都是很好解决的,只要你善于分析。在 logcat 界面查看错误日志,你会看到如图 2.16 所示的错误信息。

第一行代码:Android(2nd ed)(31):先从看得到的入手——探究活动 2.3.2

图 2.16 错误信息

错误信息中提醒我们,没有任何一个活动可以响应我们的 Intent,为什么呢?这是因为我们刚刚在 Intent 中新增了一个category,而 SecondActivity 的<intent-filter>标签中并没有声明可以响应这个category,所以就出现了没有任何活动可以响应该 Intent 的情况。现在我们在<intent-filter>中再添加一个category的声明,如下所示:

复制代码
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>

再次重新运行程序,你就会发现一切都正常了。

评论

发布