Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Activity的生命周期

$
0
0

Activity生命周期可分为两部分,一个是典型情况下的生命周期,两一个是异常情况下的生命周期。典型的情况为:有用户参与的情况下activity所经历的生命周期,异常情况为:activity被系统回收或者当前设备的Configuration发生改变到时activity被销毁。

概念介绍:

一、典型情况下的生命周期分析。
该情况下的生命周期有七个,分别是:
1) onCreate(),表示activity被创建,这是生命周期的第一个方法,一般用来初始化工作。初始化所需要的数据和布局资源等等。
2) onRestart(),表示activity被重新启动,一般当前activity从不可见变为可见状态时调用。比如用户按下home键切换到桌面,或者打开新的activity之后用户有返回到该activity,
3) onStart(),表示activity正被启动,该activity已经可见,但是还没有出现在前台,还无法和用户进行交互。只是我们肉眼看不见该activity而已。
4) onResume(),表示该activity已经出现并且我们肉眼已经可以看见。
5) onPause(),表示activity正在停止。
6) onStop(),表示activity即将停止,可以做一些稍微重量级的回收工作,但不能进行耗时操作。
7) onDestroy(),表示activity即将被销毁,这是activity生命周期的最后的一个回调。我们可以进行回收工作和一些必要的资源释放。

Activity的生命周期图如下:

针对与上图分为如下几种情况:

1) 当一个特定的Activity首次启动时,回调方法如下:onCreate -> onStart -> onResume。
2) 当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause -> onStop。有一种特出情况,就是当Activity采用了透明主题时,当前Activity将不会回调onStop。
3) 当用户再次回到原Activity时 方法回调如下:onRestart -> onStart -> onResume。
4) 当back键回退时方法调用如下:onPause -> onStop -> onDestroy。

提出Activity的问题:

假设Activity为A,用户再打开一个ActivityB,那么B的onResume和A的onPause那个先执行。
     在启动Activity的请求会有Instrumentation来处理,然后通过Binder向AMS(ActivityManagerService)发送请求。AMS维护着一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。在ActivityStack中resumeTopActivityInnerLocked方法中有源码表明,在新的Activity启动之前栈顶的Activity需要先onPause后,新的Activity才能启动,所以A先onPause然后B在onResume。

我们写一个简单的例子来验证一下,demo源码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    private String tag = "MainActivity ------ ";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,ActivityB.class);
                startActivity(intent);
            }
        });
        Log.e(tag,"onCreate");
    }

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

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(tag,"onDestroy");
    }

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

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

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(tag,"onStop");
    }
}
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

/**
 * Created by lwp940118 on 2016/10/22.
 */
public class ActivityB extends Activity{

    private String tag = "ActivityB ------ ";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activvityb);
        Log.e(tag,"onCreate");
    }

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

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(tag,"onDestroy");
    }

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

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

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(tag,"onStop");
    }
}

demo的Log打印截图如下:

二、异常情况下的上面周期分析
1) 资源相关的系统配置发生改变导致Activity被杀死并重新创建。比如手机现在处于竖屏状态,突然变为横屏状态,在默认的情况下,系统配置将发生改变,Activity就会被销毁并且重新创建。我们也可以选择阻止系统创建Activity。当系统配置发生变化后Activity会被其销毁,其onPause、onStop、onDestroy均会被调用,由于Activity为异常终止的则系统会调用onSaveInstanceState来保存当前的Activity状态,当Activity被重新创建之后系统调用onRestoreInstanceState并把Activity销毁时的onSaveInstanceState方法所保存的Bundle对象座位参数传递给onRestoreInstanceState和onCreate方法来恢复数据和Activity的状态。
2) 资源内存不足导致优先级底的Activity被杀死。Activity按照优先级高低可以分为一下三种情况:
(1) 前台Activity—正在和用户交互的Activity优先级最高
(2) 可见但非前台的Activity — 比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户进行交互。
(3) 后台Activity— 已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会根据优先级高低去杀死Activity,并在后序通过onSaveInstanceState、onRestoreInstanceState方法来存储和恢复数据。如果一个进程中没有四大组件子啊执行,那么这个进程很快就会被杀死。所以后天工作不适合脱离四大组件,一般都是将后台工作放在Service中并保证有一定的优先级。这样就不容易被杀死。
demo下载地址:(http://download.csdn.net/detail/qq_30000411/9661130)
Activity的启动模式将在以后推出。

作者:qq_30000411 发表于2016/10/22 23:16:27 原文链接
阅读:179 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>