![Android Studio移动应用开发从入门到实战(微课版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/529/26793529/b_26793529.jpg)
3.1 Activity基础
3.1.1 认识Activity
Activity的中文意思是“活动”,它是Android应用中负责与用户交互的组件。相当于Swing编程中的JFrame控件,与其不同的是,JFrame本身可以设置布局管理器,不断地向其添加组件,而Activity只能通过setContentView(View)来显示布局文件中已经定义的组件。
在应用程序中,Activity就像一个界面管理员,用户在界面上的操作是通过Activity来管理的,下面是Activity的常用事件。
· OnKeyDown(int keyCode,KeyEvent event):按键按下事件。
· OnKeyUp(int keyCode,KeyEvent event):按键松开事件。
· OnTouchEvent(MotionEvent event):单击屏幕事件。
当用户按下手机界面上的按键时,就会触发Activity中对应的事件OnKeyDown()来响应用户的操作。3.1.2节会通过具体实例讲解Activity的常用事件。
3.1.2 如何创建Activity
创建一个Activity的具体步骤如下:
(1)定义一个类继承自android.app.Activity或其子类,如图3-1所示。
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P59_4730.jpg?sign=1739659452-gQmeAX99jF2gGGWzYVazOQ2JswMzzPxg-0-89a84846f6ec46882ba3361c7a991423)
图3-1 创建Activity
(2)在res/layout目录下创建一个xml文件,用于创建Activity的布局。
(3)在app/manifests目录下的AndroidManifest.xml清单文件中注册Activity,如图3-2所示。
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P59_4734.jpg?sign=1739659452-zXDw0RAKyFDO6R6kHEE9BeECcMXwT0GL-0-0b7ffb9e8c193db1f9e4d599ee6e6711)
图3-2 Activity注册
(4)重写Activity的onCreate()方法,并在该方法中使用setContentView()加载指定的布局文件。新创建的Activity的具体代码如下所示:
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P59_11288.jpg?sign=1739659452-g3s1utnDHWnsYxq8mKUUSUARu3TUgYpo-0-84c65c99abed79c4f5fe23e1925a84b0)
接下来将通过具体的例子讲解3.1.1节中几个Activity的常用事件,具体的Activity代码如下所示:
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P59_11289.jpg?sign=1739659452-iWFjeb08egySnFZCkOB8usNgk80jfBdw-0-06d54da8a86fed83f93bc735572b0612)
运行效果如图3-3所示。
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P60_4763.jpg?sign=1739659452-H8eXYGqk2SJwnWfQzq5jii1VK1FRoIn6-0-3e339a6dc60f28b40a526bb683b8097a)
图3-3 Activity常用事件
3.1.3 Activity的生命周期
每一个Android应用程序在运行时,对于底层的Linux Kernel而言都是一个单独的进程,但是对于Android系统而言,因为局限于手机画面的大小与使用的考虑,不能把每一个运行中的应用程序窗口都显示出来。所以通常手机系统的界面一次仅显示一个应用程序窗口,Android使用了Activity的概念来表示界面。
Activity的生命周期中分为3种状态,分别是运行状态、暂停状态和停止状态。下面将详细介绍这3种状态。
· 运行状态:当Activity在屏幕最前端的时候,它是有焦点的、可见的,可以供用户进行单击、长按等操作,这种状态称为运行状态。
· 暂停状态:在一些情况下,最上层的Activity没有完全覆盖屏幕,这时候被覆盖的Activity仍然对用户可见,并且存活。但当内存不足时,这个暂停状态的Activity可能会被杀死。
· 停止状态:当Activity完全不可见时,它就处于了停止状态,但仍然保留着当前状态和成员信息,当系统内存不足时,这个Activity就很容易被杀死。
Activity从一种状态变到另一种状态时会经过一系列Activity类的方法。常用的回调方法如下:
· onCreate(Bundle savedInstanceState)——该方法在Activity的实例被Android系统创建后第一个被调用。通常在该方法中设置显示屏幕的布局、初始化数据、设置控件被单击的事件响应代码。
· onStart()——在Activity可见时执行。
· onRestart()——回到最上边的界面,再次可见时执行。
· onResume()——Activity获取焦点时执行。
· onPause()——Activity失去焦点时执行。
· onStop()——用户不可见,进入后台时执行。
· onDestroy()——Activity销毁时执行。
为了更好地理解Activity的生命周期以及在Activity不同状态切换时所调用的方法,接下来将通过Google公司提供的一个Activity生命周期图来更生动地展示,如图3-4所示。
从图3-4中可以看出,Activity在从启动到关闭的过程中,会依次执行onCreate()→onStart()→onResume()→onPause()→onStop()→onDestory()方法。如果进程被杀死,则会重新执行onCreate()方法。
为了更好地掌握Activity的生命周期中方法的执行过程,接下来将通过具体的例子来展现方法的执行顺序。
先创建一个布局界面,其中包含一个按钮,用来跳转到另一个Activity中使用,布局代码如下所示:
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P61_11295.jpg?sign=1739659452-8vg3DZVO1NDlzYsjY6OHCq3Uget8pLam-0-92b911f636761f7ea96ce6d859723828)
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P62_4794.jpg?sign=1739659452-tJcOQ6P6FGFnRWT1rtLJyTk9kfkmDAmc-0-7b0d67bf1bb5c65e759f2fe2dfaad6a3)
图3-4 Activity的生命周期图
第一个Activity的代码如下所示:
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P62_11296.jpg?sign=1739659452-ydaGdINkF6BcUwE6YqSObRqKTmv4dElk-0-608086c5a1865eb98a2f9352b9f4f723)
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P63_4814.jpg?sign=1739659452-psm4emtiYH15GuAWi2TzqcRAXJ91i6BP-0-7f4891288a9cfae0f7868126ce5f2411)
图3-5 Activity1界面
第二个Activity中的代码和使用的布局代码与第一个类似。
上面的代码写好以后,在AndroidManifest.xml中注册创建Activity。完成上述步骤以后,运行界面如图3-5所示。
使用Log来打印日志信息,在Log窗口打印的Activity生命周期的执行方法顺序如图3-6所示。
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P63_4818.jpg?sign=1739659452-vylGeomacs9zr59vNhi82ZdMFCevI8N1-0-bb59a5273e0b75c8f6228fa6b7e65651)
图3-6 Activity1的生命周期
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P64_4823.jpg?sign=1739659452-HqBmfD9WQtZjPDQtV3FGnpLdUhmxZFMc-0-a478c4c2c2ed615d227eb7d81466732a)
图3-7 Activity2界面
从图3-6中的日志信息可以看出启动Activity1依次执行了onCreate()、onStart()、onResume()方法,这是Activity从创建到可供用户操作的过程。
接下来单击第一个布局界面的按钮跳转到第二个Activity,出现如图3-7所示的界面。
与此同时,Log打印的日志信息如图3-8所示。
从图3-8中的日志信息可以看出,当跳转到Activity2的时候,Activity1会失去焦点,然后执行onPause()方法,此时Activity2创建会一次执行onCreate()、onStart()、onResume()方法。这时候Activity1会执行onstop()方法。
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P64_4827.jpg?sign=1739659452-NI3pTwxaodeEqZXgmgTgKogwgmtWmCHI-0-dad33ffb1b1cc910a80bb568e54a5843)
图3-8 Activity1跳转到Activity2的生命周期
接下来从第二个界面返回到第一个界面,此时Log打印的日志信息如图3-9所示。
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P64_4831.jpg?sign=1739659452-BP628l1SxQv7U1i2qLOx32l9rSYh1ASv-0-f1963f2d63d44a4beb21aaeb64458fa7)
图3-9 Activity2跳转到Activity1的生命周期
从图3-9中的日志信息可以看出,从Activity2再次返回到Activity1时,Activity2会先执行onPause()方法,然后Activity1会依次执行onRestart()方法、onStart()方法、onResume()方法,随后Activity2执行onstop()方法和onDestory()方法。如果退出应用程序,则Activity1会执行onStop()方法,然后执行onDestory()方法。
3.1.4 Activity中的单击事件
3.1.3节学习了Activity中的生命周期,可以看到,从第一个界面到第二个界面使用了按钮的单击事件。在Android中View的单击事件共有4种,接下来详细讲解这4种方式。
第一种为在布局文件中设置按钮的onClick属性为其指定Activity中的方法,代码如下所示:
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P64_11300.jpg?sign=1739659452-IJEhIfzwLneBx2TptLEx4RBtJ8fzbt3s-0-137421e7df106984c189a99c022d4ce4)
第二种是创建内部类的方式,创建一个内部类实现OnClickListener接口并重写onClick()方法,在方法中写入单击事件的逻辑。这一种方法不常用,所以不做详细介绍。
第三种就是主类实现OnClickListener接口,然后重写onClick()方法,并通过switch()语句判断哪个按钮被单击,具体的代码如下所示:
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P65_11302.jpg?sign=1739659452-bNznbmbTObrVexh8SI59o9F17g8dFstO-0-25ba5c628eb5d3b8ee98ae59755fe6fc)
这里需要注意的是“register.setOnClickListener(this);”方法中这个this代表的是该Activity的引用,由于Activity实现了OnClickListener接口,所以这里就代表了OnClickListener的引用,在方法中传入this,就代表该控件绑定了单击事件的接口。
第四种是匿名内部类的方式,适合按钮比较少的情况下使用。这种方式可以直接创建OnClickListener的匿名内部类传入按钮的setOnClickListener()方法和参数中,具体的代码如下所示:
![](https://epubservercos.yuewen.com/36329C/15253384904105406/epubprivate/OEBPS/Images/Figure-P65_11303.jpg?sign=1739659452-SjzHdEVwwmsLi1iPwxtLzV9aL2NakBvv-0-72e1354e0087e1bf9ebf97b0638f441c)
以上就是单击事件的处理过程,后两种匿名内部类与主类中实现OnClickListener接口的方式在平常的Android开发中使用较为普遍,所以需要熟练掌握。