Activity详解

一、简介

Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。

在一个android应用中,一个Activity通常就是一个单独的屏幕,,但也可小于屏幕并浮动在其他窗口之上。

它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。

一个应用通常由多个彼此松散联系的 Activity 组成。每次新 Activity 启动时,前一 Activity 便会停止,但系统会在堆栈(“返回栈”)中保留该 Activity。 当新 Activity 启动时,系统会将其推送到返回栈顶,并取得用户焦点。 返回栈遵循“后进先出”堆栈机制,因此,当用户完成当前 Activity 并按“返回”按钮时,系统会从栈顶将其弹出(并销毁),然后恢复前一 Activity。

二、Activity生命周期

  1. 基本状态

    • Active/Running
      一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。
    • Paused
      当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
    • Stopped
      如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
  2. 生命周期方法

    onCreate(), 当Activity被创建时调用。可以在此方法里做一些初始化的工作,加载布局,绑定事件等。
    onStart(), 当Activity可见但是还不能交互时调用
    onResume(), 当Activity已获取焦点,用户既可见又可交互时调用
    onPause(),当Activity失去焦点,用户不能交互但是仍可见,此方法会停留时间很短,所以不要在此方法中做耗时的清理工作。
    onStop(), 当Activity不可见也不可交互时,
    onDestroy(), Activity被销毁,可在此方法里做一些最终的回收和资源释放的工作。
    onRestart(),当Activity没有被销毁,重新创建时。

  3. 不同情况下生命周期方法的调用

    最简单的创建过程: onCreate(),onStart(), onResume().打开一个Activity
    最简单的销毁过程 : onPause(), onStop(), onDestroy(). 按Back键关闭刚打开的这个Activity
    按Home键退出:onPause(), onStop().
    跳转到新的Activity: onPause(), onCreate(), onResume(),onStop() .

4.Activity保存状态和创建时获取状态

当我们的程序Activity异常销毁时,那么savaInstanceState()就会调用。我们需要在此方法中,将需要重新创建时恢复的数据存入参数Bundle中。

  • 保存状态
protected void onSaveInstanceState(Bundle outState) {  
       super.onSaveInstanceState(outState);  
       String SaveData = "We must save the info";  
       String key = "SaveInfo";  
       outState.putString(key, SaveData);  
   } 
  • 获取状态
    与之相对应的是onRestoreInstanceState()方法,不过onCreate()中也可以获取保存的Bundle,不过onCreate()使用时需要进行参数Bundle的非空判断.

5.针对横竖屏切换

在AndroidManifests.xml文件,的Activity属性中添加如下代码,横竖屏切换时不会重新调用生命周期方法。只会执行onConfigurationChanged方法,横屏一次,竖屏两次。

android:configChanges="orientation | keyboardHidden | screenSize"

三、任务栈/Activity的启动模式

任务栈后进先出,先进后出。正常情况,打开一个Activity,放到栈顶。

1.四种启动模式

  • standard 标准模式,默认的启动模式。 在这种模式下启动的Activity可以被多次实例化,即在同一个任务栈中可以存在多个同一个Activity实例。
  • singleTop 单一顶部模式,顶部Activity不会重复。如果Activity的实例已经在任务栈的栈顶,那么再启动这个Activity的时候,不会再创建新的实例,而是重用位于栈顶的那个实例。
  • singleTask 单一任务栈模式,干掉头上的其他Activity。在一个任务栈中只能有一个该Activity的实例,如果已经存在Activity,系统会销毁处在改Activity之上的所有Activity,最终让改Activity实例处于栈顶。
  • singleInstance 单一实例(单例),任务栈里面自已一个人。设置了改模式的Activity会在一个独立的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说改实例启动的其他Activity会自动运行在另一个任务中。当再次启动该Activity实例时,会重用已存在的任务和实例。

2.如何指定任务栈的启动模式

2.1 manifest指定
比如我们要指定为singleTask模式
manifest里面的Activity有个 launchMode属性来制定启动模式:

<activity android:name=".SecondActivity"

            android:launchMode="singleTask"

            />

2.2 代码指定 intent.addFlag
比如我们要指定为singleTop模式

Intent intent  = new Intent();
intent.setClass(FirstActivity.this,SecondActivity.class);
// 通过Intent的addFlag指定
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

2.3、两种方式的对比
1、从优先级来说,代码指定优先于manifest指定
2、两者各有局限,
manifest无法设定 FLAG_ACTIVITY_CLEAR_TOP 标识
代码指定无法指定为 singleInstance启动模式

参考网址:http://www.jianshu.com/p/33d0a0abd990,阿敏其人(简书作者)

你可能感兴趣的:(Activity详解)