在上次的文章中介绍了Android四大组件中的广播接收者,这次接着写关于Android四大组件的东西,在这次文章中会介绍Activity,在本文中我会介绍什么是Activity,Activity的两种跳转方式(显式跳转和隐式跳转),Activity的生命周期,Activity的任务栈,Activity的启动模式。在我们写Android程序时,深入理解Activity是非常重要的,希望可以帮到大家。

1.什么是Activity
         Activity是Android的四大组件之一,它用于展示界面。Activity是一个应用程序组件,提供一个屏幕,用户可以通过与之交互完成某项任务。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

2.Activity的跳转
        Activity之间的跳转分为2种:
                显式跳转:在可以引用到那个类, 并且可以引用到那个类的字节码时可以使用。一般用于自己程序的内部。显式跳转不可以跳转到其他程序的页面中。
                隐式跳转:可以在当前程序跳转到另一个程序的页面。隐式跳转不需要引用到那个类,但是必须得知道那个界面的动作(action)和信息(category)。因此,能够被隐式跳转的Activity,在清单文件中声明时必须指定动作和信息这两个属性。
Activity之间通过Intent进行通信。Intent即意图,用于描述一个页面的信息,同时也是一个数据的载体。

3.Activity的生命周期
       
        Activity有三种状态:
   1、当它在屏幕前台时,响应用户操作的Activity, 它是激活或运行状态
   2、当它上面有另外一个Activity,使它失去了焦点但仍然对用户可见时, 它处于暂停状态。
   3、当它完全被另一个Activity覆盖时则处于停止状态。
Activity生命周期的方法状态说明:
     void onCreate()               设置布局以及进行初始化操作
     void onStart()                   可见, 但不可交互
     void onRestart()               调用onStart()
     void onResume()             可见, 可交互
     void onPause()                部分可见, 不可交互
    void onStop()                     完全不可见
     void onDestroy()               销毁

常见的Activity的生命周期历程:
   1、startActivity开启一个Activity时, 生命周期的过程是: 
          onCreate ->onStart(可见不可交互) ->onResume(可见可交互)
   2、点击back键关闭一个Activity时, 生命周期的过程是: 
         onPause(部分可见不可交互)->onStop(完全不可见)->onDestroy(销毁)
   3、当开启一个新的Activity(以对话框形式), 新的activity把后面的activity给盖住一部分时, 后面的activity的生命周期执行的方法是: 
        onPause(部分可见, 不可交互)
       注:指定Activity以对话框的形式显示, 需在activity节点追加主题:android:theme="@android:style/Theme.Dialog"
   4、当把新开启的Activity(以对话框形式)给关闭时, 后面的activity的生命周期执行的方法是: 
        onResume(可见, 可交互)
   5、当开启一个新的activity把后面的activity完全盖住时, 生命周期的方法执行顺序是: 
       onPause ->onStop(完全不可见)
   6、当把新开启的activity(完全盖住)给关闭时, 生命周期的方法执行顺序是: 
       onRestart ->onStart ->onResume(可见, 可交互)

4.Activity的任务栈
       任务栈的介绍:
           (1)程序打开时就创建了一个任务栈, 用于存储当前程序的activity,所有的activity属于一个任务栈。
     (2)一个任务栈包含了一个activity的集合, 去有序的选择哪一个activity和用户进行交互:只有在任务栈栈顶的activity才可以跟用户进行交互。
     (3)任务栈可以移动到后台, 并且保留了每一个activity的状态. 并且有序的给用户列出它们的任务, 而且还不丢失它们状态信息。
     (4)退出应用程序时:当把所有的任务栈中所有的activity清除出栈时,任务栈会被销毁,程序退出。
任务栈的缺点:
    (1)每开启一次页面都会在任务栈中添加一个Activity,而只有任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用户体验差, 
需要点击多次返回才可以把程序退出了。
     (2)每开启一次页面都会在任务栈中添加一个Activity还会造成数据冗余, 重复数据太多, 会导致内存溢出的问题(OOM)
注意:为了解决任务栈产生的问题,Android为Activity设计了启动模式,那么下面的内容将介绍Android中Activity的启动模式,这也是最重要的内容之一。

5.Activity的启动模式
        启动模式(launchMode)在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,
是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,
也就创建一个与之对应的task。Activity一共有以下四种launchMode:

·          standard

·          SingleTop

·          SindleTask

·          SingleInstance

         我们可以在项目清单文件中通过配置<activity>指定属性android:launchMode="???"设置Activity的启动模式

    四种启动模式的特点:
         

          Standard:
          standard模式是默认的启动模式,不用为<activity>配置android:launchMode属性即可,当然也可以指定值为standard。
          standard启动模式,不管有没有已存在的实例,每次都会启动一个全新的Activity

SingleTop:
           为<activity>指定属性android:launchMode="singleTop"


          使用SingleTop启动模式,跳转到设置这种启动模式的Activity(在本例中称这个Activity为B)时,系统都会在栈结构中寻找是            否有一个B的实例位于栈顶,如果有则不再产生新的,而是直接使用。如果栈内有多个Activity,并且B不位于栈顶,则会重新             生成一个新的实例。这就是SingleTop启动模式的特点,如果发现有对应的Activity正好位于栈顶,则重复利用,不会产生新的             实例。

SingleTask:
          为<activity>指定属性android:launchMode="singleTask"


        设置启动模式为SingleTask的Activity在任务栈中是唯一的,如果当前Activity在任务栈中不存在,则直接创建并获得栈顶的位                置,如果当前Activity已经在任务栈中存在,则清除任务栈中该Activity上方的所有Activity,并且让该Activity自然获得栈顶位置。

SingleInstance:
         为<activity>指定属性android:launchMode="singleInstance"


        这种启动模式比较特殊,因为它会启用一个新的栈结构,将Activity放置于这个新的栈结构中,并保证不再有其他Activity实例进          入。


     至此,Android中Activity的知识大概也写的差不多了,这些知识可能除了页面跳转,通过Intent传递数据以外其它的知识在我们现阶段都是不怎么用的
,但是Activity的生命周期以及Activity的启动模式都是十分重要的知识,深入理解Activity的生命周期和Activity的启动模式,我们可以更加简便有效的管理Activity,写出更好、更高效的程序。文章中如果有错误或者不足之处,欢迎大家指出