Android知识总结 | 四大组件之Activity

558 阅读6分钟

前言

总觉的自己对安卓的基础理解不够扎实,所以下定决心写一系列安卓的知识总结,以此共勉。

Activity的生命周期

首先Activity是什么?Activity是Android程序中与用户交互的窗口,是Android四大组件之一。为用户提供窗口,用来监听并处理用户的事件。

Activity运行过程中所处于的不同状态就是Activity的生命周期。在Android中是用任务栈来管理我们的Activity的,当前的活动就处于栈顶,每销毁一个Activity就是一个出栈的过程,而启动就是一个入栈的过程。随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态,也可能从非活动状态转入活动状态。

活动状态

  1. 运行状态:当Activity处于栈顶的时候,就是在运行状态,此时其位于前台,用户可见,可以获得焦点。

  2. 暂停状态:其他Activity处于前台,当时当前Activity依旧可见,只不过无法获取焦点(比如弹出一个dialog窗口)

  3. 停止状态:当一个Activity不再处于栈顶位置,并且完全不可见的时候,就进入了停止的状态。此时系统仍然会为这种Activity保存相应的状态和成员变量,但当内存不足的时候,处于停止状态的Activity有可能会被回收

  4. 销毁状态:一个Activity从返回栈中移除之后,就会变成了销毁的状态。系统回收这种状态的Activity,用于保证手机的内存充足。

生命周期

生命周期.png

  • onCreate():Activity被创建的时候调用,主要是进行初始化工作,比如setContentView和绑定事件等。
  • OnStart():在Activity由不可见变为可见的时候调用
  • OnResume():在Activity准备与用户交互的时候调用,此时Activity肯定处于返回栈顶。并且处于运行状态。(在弹窗消失的时候会调用)
  • onPause():通常是在启动或者恢复另一个Activity的时候调用,主要是进行一些数据存储,停止动画,释放资源,但是注意不能做耗时操作,不然会影响新栈顶Activity的使用
  • onStop():在Activity完全不可见的时候调用。可做稍微重量级一点的回收操作,比如取消网络连接,注销广播接收器等。与onPause的区别在于,如果新启动的界面(弹窗)没有完全覆盖,则调用onPause,onStop方法不会得到执行。
  • onResume():由Activity不可见变为获取焦点的状态。
  • onDestroy():在Activity销毁之前调用。进行回收工作和资源释放。

异常情况

  1. 更高优先级的进程需要内存,但系统内存不足:处于暂停/停止的(优先级低)可能会被直接杀死。onStop->直接杀死进程 手动恢复->onCreate->onStart->onResume
  2. 系统配置发生改变导致Activity销毁:running->onSaveInstanceState->onPause->onStop->onDestoy->自动重启->onCreate->onStart->onRestoreInstanceState->onResume

注意事项

1.当Activity A 启动Activity B 回调方法的顺序?如果B是一个Dialog或者完全透明的呢?

首先A:onPause->B:onCreate->B:onStart:B:onResume->A:onStop 后面的情况则 不会调用前面情况的A:onStop方法

2.谈谈onSaveInstanceState方法,以及调用时机?

当Activity意外重建的时候,如系统配置发生改变横竖屏切换等,或者内存不足的时候导致优先级低的被杀死,会在这个时候调用该方法来保存当前的Activity的一些状态信息。会在onStop方法之前调用,但和onPause调用时机没有明确顺序。

3.Activity横竖屏切换

  • 静态配置:在AndroidManifest.xmnl文件中配置:
//控制Activity为竖屏显示
android:screenOrientation:"portrait"
  • 动态配置:在代码中调用 Activity的setRequestedOrientation()方法设置属性值 4.控制Activity是否会自动重建,由configChanges属性控制

  • 在横竖屏切换的时候配置以下不自动重建,会回onConfigurationChanged()方法:

android:configChanges="orientation |keyboardHidden|screenSize"
  • 会重建:
1. 不配置android:configChanges
2. android:configChanges="orientation"
3. android:configChanges="orientation|keyboardHidden"

5.锁屏、Home、打开新Activity、处于后台手动重启 onPause->onSavaInstanceState->onStop->onRestart->onStart->onResume

Activity的状态恢复与保存

  • 需要保存/恢复的场景 当一些异常的场景导致activity非人为的销毁,系统会调用onSaveInstanceState方法进行一些状态的保存,以及onRestoreInstanceState进行状态的恢复。场景包括:锁屏,home键,其他app进入前台,启动新的Activity(全覆盖),系统内存不足杀死,横竖屏切换等
  • 如何保存和恢复 我们通常在系统调用的onSaveInstanceState(Bundle saveInstanceState)方法中,用一组存在Bundle对象中的键值对集合来存储我们需要保存/恢复的状态。当我们重启Activity的时候,上面的Bundle对象会传入到onCreate方法以及onRestoreInstanceState(Bundle saveInstanceState)中,接着从该对象中取出我们存的数据,恢复我们之前Activity的状态。
@override
public void onSaveInstanceState(Bundle saveInstanceState){
    saveInstanceState.putString("name","Hello World");
    super.onSaveInstanceState(saveInstanceState);
}
@override
public void onRestoreInstanceState(Bundle saveInstanceState){
    super.onRestoreInstanceState(saveInstanceState);
    String name = saveInstanceState.getString("name");
}

Activity的启动模式

在实际项目中,我们应该根据某些特定的需求给我们的Activity指定适合的启动模式。

  1. standard模式:标准模式,总是会为启动的Activity创建一个新的实例。创建的实例会压入返回栈中。
  2. singleTop模式:栈顶复用模式,与standard模式类似,但是在创建实例的时候会判断,栈顶是否是当需创建实例的Activity,如果是,则不创建,直接复用,同时onNewIntent方法会被执行,我们可以通过Intent进行传值。但是如果不处于栈顶,此时系统还是会创建新的Activity实例压入栈中。
  3. singleTask模式:栈内复用,保证了同一个返回栈中只有有一个实例。若需创建实例的Activity在栈中已经存在,则弹出栈中位于该实例上面的实例,使得该实例位于栈顶。这种模式最常用的就是一个app的首页,因为是app的第一个界面,长时间保留在栈中,所以最适合设置singleTask。
  4. singleInstance:在该加载模式下,系统保证无论从哪个Task中启动目标Activity,只会创建一个目标的Activity实例,并会使用一个全新的栈来加载该Activity实例。注意的是该模式加载的Activity总是位于栈顶,且创建的栈只包含该Activity。如果要启动的Activity已经存在,无论在哪个应用程序,哪个Task中,系统都会把该Activity所在的返回栈转到前台,从而使该Activity显示出来。使用于与程序分开,具有独立功能的界面,如电话拨号,闹铃提醒等。

使用方法: 在AndroidManifest.xml中通过标签指定android:launchMode属性来指定选择启动模式。

<activity 
    ...
    android:name="TestActivity"
    android:launchMode="singleTop|singleTask|singleInstance"
    ...>
   ... 
 </activity>