Android_Activity生命周期

  • Post author:
  • Post category:其他

一.每个活动在其生命周期最多会有四种状态
1>运行状态
当一个活动返回栈的栈顶时,这使得活动处于运行状态(系统最不愿意回收这种状态,因为会给用户带来非常差的体验)
2> 暂停状态
当一个活动不在栈顶,但也能看见,这时候的活动处于暂停状态(系统的内存低的时候,系统菜会回收这种活动,因为也会带非常差的体验)
3> 停止状态
当一个活动不在栈顶,处于不可见的状态,这时候的活动处于停止状态(当其他地方需要内存的时候,系统有可能会回收这种状态的活动)
4>销毁状态
当一个活动移除栈中的时候,活动处于销毁的状态(系统最先回收这种的状态的活动,从而来保证内存的充足)
二 Activity类中定义了7个回调方法,覆盖了活动生命的周期的每一个环节。
1. onCreate()
在活动第一次创建的时候会调用
2. onStart()
这个方法在活动由不可见到可见的时候调用
3.onResume()
这个方法在活动最备好和用户交互的时候会被调用(这个时候的活动一定位于返回栈的栈顶,处于运行状态)
4.onPause()
这个方法一般是系统准备开启或者恢复另一个活动的时候调用(通常需要我们能关闭一些消耗CPU的资源,或者保存一些数据,这个方法的执行速度一定要快,不然会影响新的栈顶的活动)
5.onStop()
这个方法在活动完全不可见的时候备调用,
6.onDestroy()
这个方法在程序的销毁前调用,这时候的活动状态处于销毁状态
7.onRestart()
这个方法在活动由暂停到运行状态之前会被调用
三 .根据这7中周期分为3种生存周期
1>完整的生存周期 onCreate ——onDestroy
演示方法

启动一个Activity并关闭
oncreate 创建
onstart 可见
onResume 可以交互

onPause 失去焦点
onstop 不可见
ondestroy 销毁

2>可见的生存周期 onStart ——onStop

通过Main Activity 跳转到 B Activity,BActivity 完全覆盖了MainActivity

onPause失去焦点
onStop 不可见

onRestart 从新启动
onStart 可见
onResume 可以交互

3>活动的生存周期 onResume ——onPause
通过MainActivity跳转到B Activity,B Activity 不是完全覆盖 MainActivity
如果使B Activity不完全覆盖 MainActivity
两种方式:
a、B Activity做成一个对话框形式
b、B Activity 做成一个透明的效果

onPause 失去焦点

onResume 可以交互
代码:


public class MainActivity extends Activity {

     private static final String tag = "MainActivity";

     @Override
     protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
          setContentView(R.layout. activity_main);

          Log. i(tag, "onCreate");
     }

     @Override
     protected void onStart() {
           super.onStart();
          Log. i(tag, "onStart");
     }

     @Override
     protected void onRestart() {
           super.onRestart();
          Log. i(tag, "onRestart");
     }

     @Override
     protected void onResume() {
           super.onResume();
          Log. i(tag, "onResume");
     }

     @Override
     protected void onPause() {
           super.onPause();
          Log. i(tag, "onPause");
     }

     @Override
     protected void onStop() {
           super.onStop();

          Log. i(tag, "onStop");
     }

     @Override
     protected void onDestroy() {
           super.onDestroy();

          Log. i(tag, "onDestroy");
     }


     public void click(View view) {
          Intent intent = new Intent(MainActivity.this, SecondActivity.class );
          startActivity(intent);
     }

}

四.补充
1……横竖屏切换
如果想横竖屏切换时,不重新走生命周期,需要清单为Activity配置属性:configChanges
也可以设置屏幕 锁定为横屏或竖屏 ,screenOrientation:lanscape | portriant

2……启动模式
在Android中, 启动一个Activity有时需要创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定
launchMode属性值(4个)为:
standard:
标准模式,每次调用startActivity()方法就会产生一个新的实例。这是默认的模式
singleTop:
如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。
保证栈顶只有一个实例,任务栈中可能有很多实例
场景:浏览器 书签
singleTask:
只有一个实例, 默认在当前Task中

保证 所在的任务栈 ,只有一个实例
比如说设置 A 为此模式,保证整个任务栈只有A一个实例,如果栈顶有其他Activity,再打开A时,将栈顶其他Activity全部出栈。

场景 如:webkit 内核
singleInstance:
只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象
保证整个系统的栈中,只有一个实例
比如说设置 A 为此模式,那么 A将单独使用一个任务栈
场景:打电话 、闹铃响


版权声明:本文为o_xiaojian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。