本系列博客主要学习:

为什么要学习Activity,

Activity的生命周期,

Activity的工作模式,

Activity的调用栈管理。

1:为什么要学习Activity

        Activity是四大组件中使用频率最高的组件,是与用户交互的第一接口,了解Activity的生命周期,工作模式,和调用栈管理方式是学习并了解Android的基础。

2:Activity的生命周期

2.1:正常情况下的生命周期

       不出意外的话,Activity会经历以下的生命周期:

(1)onCreate():此方法是生命周期中的第一个方法,它表示Activity正在被创建,在这个方法中我们可做些初始化工作,如通过setContentView来加载界面布局资源。初始化些数据。

(2)onStart():它表示Activity正在被启动,但还没有出现在前台,无法和用户交互。这个时候Activity已经可见了,但是我们看不见。

(3)onResume():它表示Activity已经可见,出现在前台可以和用户进行交互了。

(4)onRestart():它表示Activity正在被重新启动,正常情况下,当当前的Activity从不可见的状态变为可见的状态时,此方法就会被调用。

(5)onPause():它表示Activity正在停止,一般情况下,会紧接者执行onStop(),若是当启动的activity是透明的则不会掉用onStop()。

(6)onStop():它表示Activity即将停止。

(7)onDestroy():它表示Activity即将被销毁,这是Activity生命周期中的最后一个方法,在这里我们一般做些资源的回收,释放工作。

   注意:1:onStart()和onResume()都表示activity可见了,前者在后台(我们看不见,不可交互)后者在前台(我们可见,可交互).

               2:在onPause()不能做些太耗时的操作,因为若是太耗时则会影响新Activity的显示,onPause必须先执行完,新 Activity的onResume()才会执行。

        当Activity  Act1第一次启动时,会回调如下:onCreate()-->onStart()-->onResume()。当用户打开一个新的Activity Act2或者切换到桌面等其他界面(不是按back键后显示出的界面)时,Act1回调如下方法onPause()-->onStop(),但是当新启动的Act2采用的是通明主题则当前的Act1不会回调onStop方法。当用户再次回到Act1时,Act1回调onRestart()-->onStart()-->onResume(),但当用户从透明界面回到Act1时Act1回调onResume方法。当用户在Act1界面按back键时Act1回调:onPause()-->onStop()-->onDestroy().

注意:1:当Activity被系统回收后再次打开则和Act第一次启动时的情况一样。

            2:我们认为onCreate()和onDestroy()配对,创建和销毁。onStart()和onStop(),可见和不可见。onResume()和onPause(),前台和后台。

            3:Act1启动Act2时回调的方法先后,Act1:onPause() --> Act2:onCreate() --> Act2:onStart() --> Act2:onResume() --> Act1:onStop().



2.2:异常情况下的生命周期

2.2.1:资源系统配置发生改变导致Activity被杀死并创建

        如当Activity处于竖屏状态,当旋转屏幕,由于资源系统配置发生改变,Activity就会被销毁并且重新创建,当然Android的设计者想的很全面,我们可以阻止系统重新创建我们的Activity。

        在默认情况下,我们的Activity在不做特殊处理的情况下,当系统配置发生改变后,Activity会被销毁并重建,它会回调onPause(),onStop(),onDestroy()等方法,由于Activity是在异常情况下终止并且有机会重新显示的,系统会回调onSaveInstanceState()来保存当前Activity的状态(onSaveInstanceState方法调用的时间在onStop方法之前,它有可能在onPause方法之前,也可能在onPause方法之后。当我们按back键时onSaveInstanceState方法它是不会被调用的。)。在这种异常的情况下,当Activity被重新创建后,系统会调用onRestoreInstanceState方法,并且把先前销毁时调用的onSaveInstanceState方法中所保存的Bundle对象以参数的形式传递给onRestoreInstanceState方法和onCreate方法(onRestoreInstanceState方法调用时间在onStart方法之后,onResume方法之前,当进行恢复时官方建议使用onRestoreInstanceState方法,不用判断是否为空),Android系统会默认为我们保实现了控件的状态缓存(通过委托思想 即 上级通知下级 Android中这种思想用的很普遍如View绘制和事件分发拦截),每个View都有onSaveInstanceState方法和onRestoreInstanceState方法。


        当资源系统配置发生改变时我们不想让我们的Activity销毁和重新创建,那我们应该怎么做呢?我们可以在AndroidMenifest.xml中给Activity指定configChangs属性,如:

        1:android:configChanges="orientation" ,当屏幕旋转时我们不想让Activity销毁和创建我们可以给此Activity这样设置。

         注意:当你适配的API大于13或包含13时,防止屏幕旋转重建Activity应android:configChanges="orientation|screenSize"。

        2:android:configChanges="orientation|keyboardHidden|locale",当你想指定多个值时可以使用“|”连接。

        当我们给Activity设置了configChanges属性后,当这些对应的情况发生后,Activity则会回调onConfigurationChanged方法而不会调用onSaveInstanceState和onRestoreInstanceState方法了。

 

         如果用户的手机没有开启重力感应器或者在AndroidManifest.xml中设置了android:screenOrientation,默认情况下,该Activity不会响应屏幕旋转事件。如果在这种情况下,依然希望Activity能响应屏幕旋转,则添加如下代码:

        // 在activity的 onCreate 函数中添加

        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

        转自:http://www.cnblogs.com/PengLee/p/4084692.html

2.2.2:内存不足导致优先级低的Activity被杀死

       此种情况下的数据存储和恢复的过程和2.2.1的大致情况相同,不同的地方我已知的有 如:onSaveInstanceState方法调用的时机不同。

       Activity的优先级:

        1:正在和用户交互(可见且前台)的优先级最高。

        2:可见但不是前台,如启动一个透明主题的Activity的Activity,优先级次之。

        3:不可见而且不在前台,执行了onStop方法且没执行onDestroy方法的Activity,优先级最低。

        当一个App的内存不足时会根据Activity的优先级来杀死Activity。

       注意:在Android中我们做一些后台工作时最好不要脱离四大组件,因为如果一个进程没有四大组件那这个进程的优先级是比较低的,容易被系统杀死。


参考资料:《Android群英传》第8章

                    《Android开发艺术探索》第1章

更多相关文章

  1. Android分包MultiDex源码分析
  2. 深入Android开发之--Android事件模型
  3. 【转】Android面试题大集合
  4. Android(安卓)10 适配攻略
  5. android中-使用2D动画 — 图形处理(Canvas基础)
  6. Android(安卓)手势识别--GestureDetector
  7. Android常用组件(View学习之一)
  8. Android(安卓)Activity生命周期(Android艺术开发探索读书笔记)
  9. activity在锁屏时候的生命周期

随机推荐

  1. Android(安卓)开发 框架系列 OkHttp使用
  2. 字节跳动面试官:Android源码的Binder权限
  3. Android(安卓)完全退出应用方法
  4. Android的系统服务一览
  5. Android中的SrollView滚动详解
  6. android v13 的新特性
  7. 运行模拟器找不到路径 AVD 更改路径
  8. 转:Android(安卓)测试 Appium、Robotium、
  9. Still no compatible AVDs with target '
  10. Ubuntu下Android4.0源码的下载和编译