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所示。

图3-1 创建Activity

(2)在res/layout目录下创建一个xml文件,用于创建Activity的布局。

(3)在app/manifests目录下的AndroidManifest.xml清单文件中注册Activity,如图3-2所示。

图3-2 Activity注册

(4)重写Activity的onCreate()方法,并在该方法中使用setContentView()加载指定的布局文件。新创建的Activity的具体代码如下所示:

接下来将通过具体的例子讲解3.1.1节中几个Activity的常用事件,具体的Activity代码如下所示:

运行效果如图3-3所示。

图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中使用,布局代码如下所示:

图3-4 Activity的生命周期图

第一个Activity的代码如下所示:

图3-5 Activity1界面

第二个Activity中的代码和使用的布局代码与第一个类似。

上面的代码写好以后,在AndroidManifest.xml中注册创建Activity。完成上述步骤以后,运行界面如图3-5所示。

使用Log来打印日志信息,在Log窗口打印的Activity生命周期的执行方法顺序如图3-6所示。

图3-6 Activity1的生命周期

图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()方法。

图3-8 Activity1跳转到Activity2的生命周期

接下来从第二个界面返回到第一个界面,此时Log打印的日志信息如图3-9所示。

图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中的方法,代码如下所示:

第二种是创建内部类的方式,创建一个内部类实现OnClickListener接口并重写onClick()方法,在方法中写入单击事件的逻辑。这一种方法不常用,所以不做详细介绍。

第三种就是主类实现OnClickListener接口,然后重写onClick()方法,并通过switch()语句判断哪个按钮被单击,具体的代码如下所示:

这里需要注意的是“register.setOnClickListener(this);”方法中这个this代表的是该Activity的引用,由于Activity实现了OnClickListener接口,所以这里就代表了OnClickListener的引用,在方法中传入this,就代表该控件绑定了单击事件的接口。

第四种是匿名内部类的方式,适合按钮比较少的情况下使用。这种方式可以直接创建OnClickListener的匿名内部类传入按钮的setOnClickListener()方法和参数中,具体的代码如下所示:

以上就是单击事件的处理过程,后两种匿名内部类与主类中实现OnClickListener接口的方式在平常的Android开发中使用较为普遍,所以需要熟练掌握。