携手创作,共同成长!这是我参与「日新计划 8 月更文挑战」的第5天,点击查看活动详情
今天学习Activity和Intent,学完之后,可以实现页面带参跳转(首页->详情->拨号):
一、我讲
今天,我主要讲,第一:Activity
的生命周期,应用场景;第二:Intent
的用途,利用它实现Activity
之间的传值跳转。
1.1 窗体 Activity
对于Activity
我们已经不陌生了,前面几期都用到了,我是这么解释的:
新建的项目,
layout
文件夹下的xml
管视图,java
文件下的Activity
管逻辑。
Activity
的代码就像下面这样:
public class MainActivity extends Activity {
……
@Override
protected void onResume() {
super.onResume();
}
……
}
其实,它的本质是提供一个屏幕,并处理用户和此屏幕的交互。
有时候,你使用App时,一个页面跳到另一个页面,有可能就是一个Activity
跳到另一个Activity
。
生命周期
生命周期是一个枯燥的理论,但是在项目实战中却很有用。生命周期是面试必问的话题之一,一些工作两三年的应聘者,会嫌问的刁钻,他们说实际做项目根本用不到。相反,5年以上安卓开发,对这个问题却能很好地回答。
生命周期,可以通俗地理解为“从摇篮到坟墓”的整个过程。
Activity
也是有生命周期的。相信大家都看到过这个图,这是安卓官方文档的一张图。
我总结成下面这个图,80%的精华都在这6个函数上。
我们重点关注Activity
什么时候创建销毁、可见不可见、能不能开始交互。有时候虽然界面可见,但是你没法和界面交互(比如一个Dialog
风格的Activity_B覆盖在Activity_A上面,虽然你能看见A,但是无法点击,此时A处于生命周期的onPause
。如果一个AlertDialog
对话框在Activity_A上弹出,虽然A也是可见不可交互,但是并不执行onPause
方法)。
写程序更多的是处理异常情况,Activity生命周期的应用场景,多数也是用在一些异常情况上。
了解什么时候处于什么状态,这一点非常关键。
看下面这个小例子,非常能说明问题:
- 当第一次打开
Activity
,它提示:初次见面,多多关照。 - 当你准备要切换到其他程序时,它提示:等您回来。
- 当你后悔了,不切了,它提示:继续为您服务。
- 当你狠心退出,它又提示:再见,再见。
你敢说,你的App不会被用户这么操作吗?你能不关注这些操作对你正向流程的冲击吗?
1.2 意图 Intent
它负责对应用中一次操作的动作及数据进行描述,Android
则根据此Intent
的描述,找到对应的组件,完成调用。
一句话解释就是:你要去找谁(目标组件,比如Activity)?带着什么礼物(动作、描述)?
上面那个图,如果Activity-1想要启动Activity-2,那么就可以通过Intent
。
跳转指定Activity
Intent通过如下方式实现两个Activity之间的传值跳转。
跳转指定意图
除了跳转到明确的Activity
,Intent
也支持隐式跳转,比如它说我要打电话,发短信,系统就会分配到对应的跳转目标。
// 调用系统打电话
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,第二个页面有个拨号按钮,点击调到系统的拨号盘。
首先,我们先写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天可入门安卓。