Java转Android:第5天 用Activity和Intent实现小通讯录

语言: CN / TW / HK

theme: juejin

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情


今天学习Activity和Intent,学完之后,可以实现页面带参跳转(首页->详情->拨号): 拨号盘.GIF

一、我讲

今天,我主要讲,第一:Activity的生命周期,应用场景;第二:Intent的用途,利用它实现Activity之间的传值跳转。

1.1 窗体 Activity

对于Activity我们已经不陌生了,前面几期都用到了,我是这么解释的:

新建的项目,layout文件夹下的xml管视图,java文件下的Activity管逻辑。

image.png

Activity的代码就像下面这样: java public class MainActivity extends Activity { …… @Override protected void onResume() { super.onResume(); } …… } 其实,它的本质是提供一个屏幕,并处理用户和此屏幕的交互。

有时候,你使用App时,一个页面跳到另一个页面,有可能就是一个Activity跳到另一个Activity

生命周期

生命周期是一个枯燥的理论,但是在项目实战中却很有用。生命周期是面试必问的话题之一,一些工作两三年的应聘者,会嫌问的刁钻,他们说实际做项目根本用不到。相反,5年以上安卓开发,对这个问题却能很好地回答。

生命周期,可以通俗地理解为“从摇篮到坟墓”的整个过程。 人的生命周期.png

Activity也是有生命周期的。相信大家都看到过这个图,这是安卓官方文档的一张图。 官方生命周期.png

我总结成下面这个图,80%的精华都在这6个函数上。

程序生命周期.png

我们重点关注Activity什么时候创建销毁、可见不可见、能不能开始交互。有时候虽然界面可见,但是你没法和界面交互(比如一个Dialog风格的Activity_B覆盖在Activity_A上面,虽然你能看见A,但是无法点击,此时A处于生命周期的onPause。如果一个AlertDialog对话框在Activity_A上弹出,虽然A也是可见不可交互,但是并不执行onPause方法)。

写程序更多的是处理异常情况,Activity生命周期的应用场景,多数也是用在一些异常情况上。

image.png

了解什么时候处于什么状态,这一点非常关键。

看下面这个小例子,非常能说明问题: - 当第一次打开Activity,它提示:初次见面,多多关照。 - 当你准备要切换到其他程序时,它提示:等您回来。 - 当你后悔了,不切了,它提示:继续为您服务。 - 当你狠心退出,它又提示:再见,再见

App状态.GIF

你敢说,你的App不会被用户这么操作吗?你能不关注这些操作对你正向流程的冲击吗?

1.2 意图 Intent

它负责对应用中一次操作的动作及数据进行描述,Android则根据此Intent的描述,找到对应的组件,完成调用。

一句话解释就是:你要去找谁(目标组件,比如Activity)?带着什么礼物(动作、描述)?

Intent.png

上面那个图,如果Activity-1想要启动Activity-2,那么就可以通过Intent

跳转指定Activity

Intent通过如下方式实现两个Activity之间的传值跳转。

image.png

跳转指定意图

除了跳转到明确的ActivityIntent也支持隐式跳转,比如它说我要打电话,发短信,系统就会分配到对应的跳转目标。 ```java // 调用系统打电话 Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:12345")); startActivity(intent);

// 调用系统发短信 Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:12345")); startActivity(intent); ```

二、你做

下面,我们要做这么一个功能,类似于通讯录:

第一个页面是联系人主页面MainActivity,上面只展示一个张三。点击张三,携带着张三的姓名和电话,跳转到第二个详情页面DetailActivity,第二个页面有个拨号按钮,点击调到系统的拨号盘。

拨号盘.GIF

首先,我们先写MainActivity的布局文件activity_main.xml,上面只有一个按钮。 ```xml

`` 注意啦,注意啦,上面的TextView有一个属性onClick="toDetail",另外ConstraintLayout还有一个属性context=".MainActivity",这代表TextView有一个叫toDetail的点击事件在MainActivity中。这种方式可以替代textView.setOnClickListenner`设置按钮事件。

下面就可以看到MainActivity里有一个toDetail(View view)方法,正好对应xml里的设置。在这个方法里,我们看到,它采用Intent进行传值跳转。 ```java public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void toDetail(View view) {

    Intent intent = new Intent(this, DetailActivity.class);
    intent.putExtra("name","张三");
    intent.putExtra("phone","666666");
    startActivity(intent);
}

} ```

下面是跳转进入的详情页DetailActivity的布局activity_detail.xml,里面是2个文本,一个拨号按钮,同样,拨号按钮也采用了android:onClick="call"的定义模式。

```xml