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


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

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

一、我讲

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

1.1 窗体 Activity

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

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

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

Activity的代码就像下面这样:

public class MainActivity extends Activity {
    ……
    @Override
    protected void onResume() {
      super.onResume();
    }
    ……
}

其实,它的本质是提供一个屏幕,并处理用户和此屏幕的交互。

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

生命周期

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

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

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

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

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

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

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

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

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

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

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

看下面这个小例子,非常能说明问题:

  • 当第一次打开Activity,它提示:初次见面,多多关照
  • 当你准备要切换到其他程序时,它提示:等您回来
  • 当你后悔了,不切了,它提示:继续为您服务
  • 当你狠心退出,它又提示:再见,再见

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

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

1.2 意图 Intent

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

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

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

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

跳转指定Activity

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

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

跳转指定意图

除了跳转到明确的ActivityIntent也支持隐式跳转,比如它说我要打电话,发短信,系统就会分配到对应的跳转目标。

// 调用系统打电话
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,第二个页面有个拨号按钮,点击调到系统的拨号盘。

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

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

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="张三"
        android:onClick="toDetail"
        />
</android.support.constraint.ConstraintLayout>

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

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

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 version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    tools:context=".DetailActivity">
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="张三"/>
    <TextView
        android:id="@+id/phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1234567898" />
    <Button
        android:id="@+id/call"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="拨号"
        android:onClick="call" />
</android.support.constraint.ConstraintLayout>

下面是详情页DetailActivity的逻辑代码:

public class DetailActivity extends AppCompatActivity {
    String sPhone;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        TextView name = findViewById(R.id.name);
        TextView phone = findViewById(R.id.phone);
        Intent intent = getIntent();
        String sName = intent.getStringExtra("name");
        sPhone = intent.getStringExtra("phone");
        name.setText(sName);
        phone.setText(sPhone);
    }
    public void call(View view) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:"+sPhone));
        startActivity(intent);
    }
}

首先使用getIntent()获取上游传来的信息,然后把数值给文本控件显示出来。当点击拨号按钮时,采用隐示意图,进行拨号盘的调用。

至此,我们的小程序就完成了。

其实,这挺有用的,可以为老年人的安卓手机写一个极其简单的通讯录,只有几个固定联系人,点击头像就去拨号。现在系统的通讯录虽然功能强大,但是层级很多,是一个通用的功能。

我们掌握了这个方法,就可以做出个性化定制功能,我想这也是学技术的意义所在。

三、关于

现在,行业内多是Android转Java,很少有Java转Android的。

但是,这并不妨碍Java同学了解Android开发,从学习的角度去拓宽自己的知识面。

所以,我会以最精简的语言来编写一个系列教程《Java转Android》(第一季30篇,日更)。

其实,不管是Java还是python,只要有编程基础的同学,一天看800字,30天可入门安卓。