Android Intent使用

学习书《第一行代码笔记》     

      Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想
要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服
务以及发送广播等场景,由于服务、广播等概念你暂时还未涉及,那么本章我们的目光无
疑就锁定在了启动活动上面。

        Intent大致可以分为两种:显式Intent 和隐式Intent.

1、显式Intent

        Intent有多个构造函数的重载,其中一个是 Intent(Context packageContext, Class
cls) 。这个构造函数接收两个参数,第一个参数 Context 要求提供一个启动活动的上下
文,第二个参数 Class 则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent 的“意图”。Activity类中提供了一个 startActivity() 方法,这个方法是专门用于启动活动的,它接收一个 Intent 参数,这里我们将构建好的Intent传入 startActivity() 方法就可以启动目标活动了。

button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});

我们首先构建出了一个Intent,传入 FirstActivity.this 作为上下文,传
入 SecondActivity.class 作为目标活动,这样我们的“意图”就非常明显了,即在
FirstActivity这个活动的基础上打开SecondActivity这个活动。然后通过 startActivity() 方
法来执行这个Intent。

Android Intent使用_第1张图片

        可以看到,我们已经成功启动SecondActivity这个活动了。如果你想要回到上一个活动怎
么办呢?很简单,按下Back键就可以销毁当前活动,从而回到上一个活动了。
使用这种方式来启动活动,Intent的“意图”非常明显,因此我们称之为显式Intent 。

2、隐式Intent

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

        通过在 标签下配置 的内容,可以指定当前活动能够响应的action 和 category ,打开AndroidManifest.xml,添加如下代码:






         在 标签中我们指明了当前活动可以响应 com.example.activitytest.ACTION_START这个 action ,而 标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的 category 。只有 中的内容同时能够匹配上Intent中指定的 action 和 category 时,这个活动才能响应该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 的活动。那前面不是说要 同时匹配上才能响应的吗?怎么没看到哪里有指定category 呢?这是因为 android.intent.category.DEFAULT 是一种默认的 category ,在调用 startActivity() 方法的时候会自动将这个 category 添加到Intent中。

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

        每个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界面查看错误日志,你会看到如图所示的错误信息。

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







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

你可能感兴趣的:(android,android,studio,ide)