zoukankan      html  css  js  c++  java
  • Activity的生命周期

    概述: 四大组件之一的Activity组件,在应用中一个Activity可以用来表示一个界面,我们通常可以理解成“活动”,即一个活动开始,代表Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动。Activity的生命周期交给系统统一管理。

    先来看千年离不开的Activity生命周期图:

                                     

    在Android中,Activity拥有三个基本状态:

    1. Resumed: 一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
    2. Paused: 当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但是它失去了焦点,不可与用户交互。
    3. Stopped: 当Activity被另外一个Activity覆盖,失去焦点并不可见时处于Stopped状态。
     1 public class MainActivity extends Activity {
     2     public  static final String tag = "MainActivity的生命周期测试---";
     3     private Button button; 
     4     //Activity创建时被调用
     5     @Override
     6     protected void onCreate(Bundle savedInstanceState) {
     7         super.onCreate(savedInstanceState);
     8         setContentView(R.layout.activity_main);
     9         Log.i(tag, "onCreate");
    10         button = (Button) findViewById(R.id.button);
    12         button.setOnClickListener(new View.OnClickListener() { 
    13             @Override
    14             public void onClick(View v) {
    15                 //点击button跳转到Main2Activity界面,Main2Activity在配置文件中设置为透明属性
    16                 Intent intent = new Intent(MainActivity.this, Main2Activity.class);
    17                 startActivity(intent);
    18             }
    19         });
    20     }
    21 
    22     //Activity重新可见时被调用,接着会调用onStart()
    23     @Override
    24     protected void onRestart() {
    25         super.onRestart();
    26         Log.i(tag, "onRestart");
    27     }
    28 
    29     //Activity可见时被调用
    30     @Override
    31     protected void onStart() {
    32         super.onStart();
    33         Log.i(tag, "onStart");
    34     }
    35 
    36     //Activity获得焦点,可以进行交互时被调用;处于前台状态
    37     @Override
    38     protected void onResume() {
    39         super.onResume();
    40         Log.i(tag, "onResume");
    41     }
    42 
    43     //Activity失去焦点,但是可见(在其他应用需要内存时可能会被kill掉),此状态可以转为前台onResume()
    44     @Override
    45     protected void onPause() {
    46         super.onPause();
    47         Log.i(tag, "onPause");
    48     }
    49 
    50     //Activity完全不可见时被调用(可能会被系统kill掉);例如返回到此状态时,如果没有被kill那么就会调用onReStart()
    51     @Override
    52     protected void onStop() {
    53         super.onStop();
    54         Log.i(tag, "onStop");
    55     }
    56     //Activity被销毁时被调用
    57     @Override
    58     protected void onDestroy() {
    59         super.onDestroy();
    60         Log.i(tag, "onDestroy");
    61     }
    62 }

    设置Main2Activity为透明:

       <activity
                android:theme="@android:style/Theme.Translucent"
                android:name=".Main2Activity"
                android:label="@string/title_activity_main2" >
            </activity>

    结论:

    • 启动Activity, onCreate()->onStart()->onResume(), Activity处于运行状态(Resumed状态)
    • 10-21 21:00:14.859 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onCreate
      10-21 21:00:14.859 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStart
      10-21 21:00:14.859 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onResume

    •  接下来点击button, 跳转到Main2Activitytou透明界面中,处于onPaused状态
    • 10-21 21:00:36.256  28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onPause
    •  从Main2Activitytou返回,则MainActivity的主界面又处于运行状态(Resumed状态)[注意: 但也有可能由于系统内存不足,杀死了这个后台状态的Activity(此时这个Activity引用仍在任务栈中,只是这时候引用指向的对象为null),若再次回到这个Activity则会经过: onCreate() -> onStart() -> onResume() ]。
    • 10-21 21:01:13.813  28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onResume
    • Activity退居后台时,即是当Activity转到新的Activity界面(不透明或是Dialog属性),按Home键回到主屏或这是锁屏: onPause -> onStop(), 进入停滞状态 (Stopped状态)
    • 10-21 21:01:47.057 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onPause
      10-21 21:01:47.127 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStop

    • 再次回居前台:onRestart() -> onStart() -> onResume(),再次回到运行状态;[注意: 但也有可能由于系统内存不足,杀死了这个后台状态的Activity(此时这个Activity引用仍在任务栈中,只是这时候引用指向的对象为null),若再次回到这个Activity则会经过: onCreate() -> onStart() -> onResume() ]。
    • 10-21 21:02:02.274 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onRestart
      10-21 21:02:02.277 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStart
      10-21 21:02:02.387 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onResume

    • 从运行状态点击返回键时,任务栈没有Activity,也就是程序退出了:onPause() -> onStop() -> onDestory()
    • 10-21 21:02:28.791 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onPause
      10-21 21:02:29.221 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStop
      10-21 21:02:29.221 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onDestroy 

    锁屏: onPause() -> onStop()

    解锁: onRestart() -> onStart() -> onResume()

  • 相关阅读:
    jQuery中的prop和attr区别
    echarts 不同区域背景色不同 废了我一天的时间
    echarts 饼状图 改变折线长度
    jqGrid有关问题 小知识点
    echarts页面中多图自适应
    bootstrap详解 见网址
    前端自适应布局方法总结
    前端页面中如何在窗口缩放时让两个div始终在同一行显示
    Vue2.0 v-for 中 :key 到底有什么用?
    sublime中安装package control总是失败
  • 原文地址:https://www.cnblogs.com/denluoyia/p/5985886.html
Copyright © 2011-2022 走看看