Android基础知识-1

1、Android的Activity任务栈

        在Android的系统中,在APP运行时每个APP都会默认有一个任务栈,任务栈的名称以APP的包名命名。任务栈是一中先进后出的结构,APP中每一个调用的Activity均会按照先后顺序进栈,处于焦点下的Activity处于任务栈的栈顶。

    当用户按back键时,栈内的Activities会按照先后顺序出栈,并调用该Activity的OnDestroy方法。如果栈内已经没有元素时,系统会回收该APP的任务栈。

 

     在Activity的的xml标签中,可以定义每个Activity的模式。不同的模式在任务栈中调用时的表现也是不同的:        

  • standard模式:标准模式。在该模式下,每次启动的Activity都会创建一个实例将其压入任务栈中,不管此时该Activity是否已经存在。
  • singleTop模式:栈顶复用模式。如果当前启动的Activity此时恰好处于任务栈栈顶的位置,那么就会复用该Activity。此时不会重新执行Activity的OnCreate、OnStart和OnResume方法,但是会执行OnNewIntent()方法。如果该Activity不在栈顶位置,则与standard模式一样。
  • singleTask模式:栈内复用模式。比较霸道的一种模式,当Activity启动时会判断当前栈内是否已经存在。如果不存在,先创建该Activity实例并将其压入任务栈内。如果存在,则会将该Activity上面的所有Activity清除掉,将该Activity调到栈顶位置,调用OnNewIntent方法。
  • singleInstance模式:加强版的singleTask模式,这个模式下的Activity处于一个单独的任务栈内,除非所在的任务栈被销毁,否则不会创建新的Activity。

     

        Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放在一个List里面.可以认为一个ActivityRecord就是一个Activity任务栈。

 

2、Activity的缓存

        为什么要有Activity的缓存?举个栗子:当应用从Activity A进入到Activity B后的一段时间后,A的资源被系统回收。当你从B按back键要回到A时,前一次A的数据和状态都已经丢失,此时不会执行A的OnRestart方法,而是重新执行了A

   的OnCreate方法。    So,Activity的缓存就有了存在的价值。

        Activity有一个封装好的方法:onSaveInstanceState() 。当Activity被销毁之前,该方法会被回调用以保存Activity的状态和数据。该方法有个Bundle参数,方法中可以使用putString() 、putInt()方法保存需要保存的参数。在Activity启动调用

   OnCreate方法时,也有一个Bundle参数,该参数就是上次Activity销毁时保存下来的数据。

      那么有哪些场景会触发onSaveInstanceState()方法呢?答案是非用户主动销毁的动作那么该方法就都会被调用。

  • 用户按HOME键的动作
  • 切换到其他应用
  • 灭屏时
  • 从当前的Activity进入另一个Activity
  • 如果不设定configchange属性,屏幕横竖屏切换也会,因为横竖屏切换时系统会先销毁当前Activity,然后在切换后再重新创建。   

       还有一些细节知识:

  1. UI布局中的每一个View都默认实现了onSaveInstanceState()方法,这意味着UI界面的每一个改动都会被存储并在Activity重建时恢复。这有一个前提,那就是这个UI界面需要一个ID,如果没有ID,前面的实现都不会被调用。
  2. onSaveInstanceState()方法调用有不确定性,只能用这个方法去记录activity的瞬间状态(UI的状态)。不能用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()方法中存储持久化数据(例如应该被存储到数据库中的数据)。
  3. onSaveInstanceState()如果被调用,那么一定是在onStop()前被触发,但每次不一定是在onPause()之前或者之后触发。

 

      明天继续~

posted @ 2017-01-14 22:28  风情云淡~  阅读(132)  评论(0编辑  收藏  举报