Activity的生命周期

一、典型情况下的生命周期

4种活动状态(每个活动在其生命周期中最多可能有4种状态):
运行状态:活动位于返回栈栈顶时,即在前台可见可交互。
暂停状态:活动不再处于栈顶位置但仍然可见。
停止状态:活动不再处于栈顶位置但完全不可见
销毁状态:活动从返回栈移除时。

在正常情况下,Activity会经历如下生命周期:

onCreate():表示Activity正在被创建,是在活动第一次被创建的时候调用。在这个方法中可以完成活动的初始化操作,比如加载布局,绑定事件等等。
onRestart():表示Activity正在重新启动。一般是由用户行为导致的,当用户切换到桌面或者打开另一个界面,再次返回到本界面时出现。即当前Activity从不可见重新变成可见状态时被调用(或者说活动由停止状态变为运行状态之前调用)。
onStart():表示活动正在被启动,即将开始。活动由不可见变为可见时调用。此时Activity可见,在后台,不可交互。可以理解为Activity已经显示了,但是我们还看不到。
onResume():表示Activity已经可见,并出现在前台开始活动。是在活动准备好和用户进行交互的时候调用。此时活动处于返回栈栈顶,并且处于运行状态。
onPause():表示Activity正在停止,正常情况下,紧跟着会调用onStop()。是在系统准备去启动或者恢复另一个活动的时候调用或者特殊情况下,快速地再回到当前Activity时会调用。此时可以保存一些关键数据,停止动画,释放消耗CPU的资源等等。
onStop():表示Activity即将停止,在活动完全不可见时调用。可以做一些稍微重量级的回收工作,不能耗时。此方法必须执行完,新的Activity的onPause()才会执行。
onDestroy():表示Activity即将被销毁,在活动被销毁之前调用,只调用一次,之后活动状态变为销毁状态。此时可以做一些回收工作和最终资源释放。

还可以将活动分为3种生存期:

  • 完整生存期:活动在方法onCreate()和onDestroy()之间所经历的,就是完整生存期。
  • 可见生存期:活动在方法onStart()和onStop()之间所经历的,就是可见生存期。在可见生存期内,活动对于用户是可见的,但不一定可交互。随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。可以通过这两个方法对合理的管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载,在onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
  • 前台生存期:活动在方法onResume()和onPause()之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态,可以和用户进行交互。随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。

Activity的生命周期如图所示:
在这里插入图片描述
【具体说明】
(1)针对一个特定的Activity,第一次启动,回调如下:
onCreate->onStart->onResume。
(2)当用户打开新的Activity或者切换到桌面的时候,回调如下:
onPause->onStop。一种特殊情况是如果新的Activity采用了透明主题,那么当前Activity不会回调onStop。
(3)当用户再次回到原Activity时,回调如下:onRestart->onStart->onResume
(4)当用户按back键退出程序时,回调如下:onPause->onStop->onDestroy。
(5)当Activity被系统回收后再次打开,生命周期方法回调过程和(1)一样。
【注意】
(1)onStart和onResume,onPause和onStop看起来是一样的,但是这两个配对的回调分别表示不同的意义。onStart和onResume是从Activity是否可见这个角度来回调的,onPause和onStop是从Activity是否位于前台这个角度来回调的。
(2)onStart()方法调用时Activity在后台,onResume()方法调用时Activity才显示到前台。
(3)如果启动的新活动是一个对话框式的活动,那么onPause()方法会执行,onStop()方法不会执行。
实例
定义一个普通活动NormalActivity和一个对话框式的活动DialogActivity,MainActivity主活动中定义两个按钮,用于启动刚刚定义的两个活动,点击第一个按钮会启动NormalActivity,点击第二个按钮会启动DialogActivity

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG,"onCreate");
        if (savedInstanceState != null) {
            String tempData = savedInstanceState.getString("data_key");
            Log.d(TAG,tempData);
        }
        Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
        Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
        startNormalActivity.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,NormalActivity.class);
                startActivity(intent);
            }
        });
        startDialogActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,DialogActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG,"onRestart");
    }

    @Override
    protected void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        String tempData = "Something you just typed";
        outState.putString("data_key",tempData);
    }
}

启动活动:当Activity第一次被创建时会依次执行
onCreate->onStart->onResume
在这里插入图片描述
点击第一个按钮,启动普通活动:新活动NormalActivity完全遮挡MainActivity
在这里插入图片描述
按下Back键返回MainActivity:由于之前MainActivity已经进入了停止状态,所以onRestart()方法会执行,然后执行onStart()方法和onResume()方法。注意此时不会执行onCreate()方法,MainActivity没有被重建。
在这里插入图片描述
点击第二个按钮,启动对话框式活动:此时只执行了onPause()方法,因为没有完全遮挡住MainActivity,MainActivity只是进入了暂停状态。
在这里插入图片描述
按下Back键返回MainActivity:
在这里插入图片描述
按下Back键退出程序:执行onPause->onStop->onDestroy,销毁活动MainActivity
在这里插入图片描述

二、异常情况下的生命周期分析

1.情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建

就比如说当前Activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,其生命周期如图所示:
在这里插入图片描述
当系统配置发生改变后,Activity会被销毁,onPause,onStop,onDestroy都会被调用,同时由于Activity是在异常情况下终止的,系统会在onStop之前调用onSaveInstanceState来保存当前Activity的状态。Activity被重新创建之后,系统会调用onRestoreInstanceState,把Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。因此可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建。需要注意的是系统只会在Activity即将被销毁并且有机会重新显示的情况下才会去调用onSaveInstanceState方法,也就是说系统只在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。

2.情况2:资源内存不足导致低优先级的Activity被杀死

Activity的优先级情况(优先级从高到低):

  1. 前台Activity:正在和用户交互的Activity,优先级最高。
  2. 可见但不在前台的Activity:比如Activity中弹出一个对话框,导致Activity可见但位于后台无法直接和用户交互。
  3. 后台Activity:已经被暂停的Activity,比如执行了onStop方法,优先级最低。

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程中没有四大组件在执行,它会很快被系统杀死。因此,比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,不会被系统轻易杀死。

3.如果不想Activity被重建

在AndroidMenifest.xml中标签中加入声明:
在这里插入图片描述
orientation这个值表示屏幕方向发生了改变,比如旋转手机屏幕,当你不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加这个值。如果想指定多个值,可以用“|”连接起来。configChanges的项目可以自由选择。
当Activity没有重新创建时,系统会调用Activity的onConfigurationChanged方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值