深入了解Activity-生命周期

一 介绍

Activity是android中使用最为频繁的组件,在官方文档中是这样描述的:An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View).
一个activity就是一个单一的可以与用户进行交互的东西,或者说界面,几乎所有的Activity都要和用户进行交互,Activtity的重要性就很明显了,所有每一个Android童鞋都应该掌握它。今天了解的是Ativity的生命周期。

二 正常情况下的生命周期

正常情况下的生命周期就是我们使用中,Activity经过的生命周期.下面是官网給的Activity生命周期的图,使用它可以帮助我们更直观的理解Activity的生命周期
这里写图片描述

正常情况下,Activity会经历如下声明周期:

1 onCreate : 该方法表示Activity正在被创建,在这个方法里可以做一些初始化的工作,setContentView去加载布局,通过findViewById获得要操作的控件,以及初始化数据等操作。
2 onReStart : 表示Activity正在重新启动,当Activity从不可见变为可见状态的时候,该方法就会被调用,比如你打开了一个新的Activity,此时当前的Activity就会执行onPause和onStop方法,接着当我们按返回键的时候,就会调用此方法.
3 onStart : 表示Activity正在被启动,此时Activity已经可见了,只是没有出现在前台界面,不能和用户进行交互,比如点击事件之类的
4 onResume : 表示Activity已经可见并且可以进行用户交互。注意和onStart方法的区别
5 onPause : 表示Activity正在停止。该方法被调用的情况一般是当前Activity变为不可见状态的时候.
6 onStop : 表示Activity 即将停止。该方法被调用的情况一般是当前Activity变为不可见状态的时候.
7 onDestory : 表示Activity 即将被销毁,我们可以在这里做一些回收工作和资源释放.

三 正常情况下的生命周期例子

说了那么多,我们自己写一个例子,可以更好的理解。在android studio中新建两个Activity:MainActivity和Main2Activity(as会默认为我们创建好MainActivity )

MainActivity代码如下:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "lifecycle";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, this.getLocalClassName() + ":onCreate");
    }

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

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

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

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

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

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void click(View view) {
        startActivity(new Intent(this,Main2Activity.class));
    }
}

Main2Activity代码如下:

public class Main2Activity extends AppCompatActivity {

    private static final String TAG = "lifecycle";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Log.d(TAG, this.getLocalClassName() + ":onCreate");
    }


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

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

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

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

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

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main2, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

上面的代码很清楚了,就是重写了Activity生命周期的各个方法,然后用log打印出来。下面启动MainActivity,log日志打印如下:

这里写图片描述
可以看到我们MainActivity启动的时候经过的生命周期: onCreate ——>onStart——>onResume

我们点击toMain2按钮进入Main2Activity,log日志打印如下
这里写图片描述
可以看到log打印了MainActivity执行了onPause->onStop方法,变为不可见了,Main2Activity就和上面的情况一样了。

此时我们在Main2Activity点击回退按钮再查看log信息:
这里写图片描述
可以看到log打印了Main2Activity执行了onPause->onStop->onDestroy方法,
MainActivity由于还在任务stack中所以执行 onRestart->onStart->onResume,结合上面的图就很好理解了。

我们在MainActivity中再次点击back回退,log如下:
这里写图片描述
此时MainActivity变为不可见,最后被销毁了.onPause->onStop->onDestory

对于上面的生命周期, onCreate对应于onDestroy,创建与销毁,onStart对应onStop,表示了Activity的是否可见,而onResume对应于onPause,
这里需要注意,onStart,onStop是对应于Activity是否可见来说的,而onResume于onPause是从Activity是否位于前台来说的

注意上面的log,Main2启动之前总是Main已经执行了onPause方法之后。

四 异常情况下的生命周期

异常情况主要是指系统资源相关的配置发生了改变,或者系统内存不足Activity被杀死的情况
系统配置发生改变最常见的就是横竖屏切换了,默认情况下,横竖屏切换后由于系统配置发生了改变,Activity就会被重新创建,并且会多调用一个onSaveInstanceState来保存Activity的状态,Activity被重新创建后,会调用onRestoreInstanceState来恢复一下数据,我们可以根据这个方法是否被调用来判断Activity是否被重建了.这两个方法系统组哦了一些View的恢复工作,比如用户输入的数据,焦点等

五 异常情况下的生命周期的例子

在MainActivity中加入如下代码:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, this.getLocalClassName() + ":onSaveInstanceState");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, this.getLocalClassName() + ":onRestoreInstanceState");
    }

重新启动MainActivity,然后将手机横屏显示,此时log信息如下:这里写图片描述
可以看到的确调用了onSaveInstanceState和onRestoreInstanceState方法来保存数据和恢复数据。我们也可以在onSaveInstanceState中保存一些我们的信息,然后在onRestoreInstanceState和 onCreate中做恢复;

代码如下:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, this.getLocalClassName() + ":onSaveInstanceState");
        outState.putString("data","this is my data");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, this.getLocalClassName() + ":onRestoreInstanceState"+"data is "+savedInstanceState.get("data"));
    }

再进行横竖屏切换后发现在onRestoreInstanceState方法中log输出了data数据.

另外一种异常情况是内存不足的时候

如果我们想要系统资源发生改变以后不重新创建, 只需要在AndroidManifest.xml 中指定android:configChanges=”orientation|screenSize”

android:configChanges可配置的参数有很多,具体的意思参考官网或其他资料查看.

到这里相信大家对Activity的生命周期已经有了很好的理解了.

转载于:https://www.cnblogs.com/yangqiangyu/p/5143088.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值