Android Activity生命周期

我是偷的,,,,

Android学习之Activity生命周期
 

一、Activity生命周期说明

   Activity的四种状态:

  ⒈活动状态(Active or Running):也称为运行状态,处于Activity栈顶,在用户界面中最上层,完全能被用户看到,能够与用户进行交互;

  ⒉ 暂停状态(Paused):Activity失去焦点,Activity界面被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,与窗口管理器保持连接),但是在系统内存不够用的时候将被杀掉;
  ⒊停止状态(Stopped):Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡,但它依然保持所有状态和成员信息,只是它不再可见,它的窗口被隐藏;
  ⒋非活动状态(Killed):当系统内存需要被用在其他地方的时候,一个停止状态的Activity被杀掉。
  如果一个Activity是Paused或者Stopped状态时可以被恢复,也可以被删除。一个被删除(杀掉)的Activity如果需要重新恢复就需要重启。

  当一个activity的当前状态发生改变时,当前activity就会触发一系列的回调方法。这些回调方法很明白的阐述了activity生命周期的变化过程。

  这些方法分别为:onCreat();onstart();onResume;onPause();onStop();onRestart();onDestroy();

二、生命周期图解说明

 

这张图,相信学习过android开发的大牛们都非常的熟悉了,但我还是图解一下:

1、当一个activity启动时,首先会调用onCreat();方法,然后调用onStart();方法,接下来调用onResume();方法。进入activity界面,此时的activity处于Running状态。

2、当一个不是全屏的activity被启动时(即当前activity被不完全遮住,dialog除外),那么当前activity首先会执行onPause();方法,当不是全屏的activity被从栈顶移除是,那么activity会执行onResume();方法。

3、当当前activity被新的activity完全覆盖时,或者按home回到主界面时,当前activity会执行,onPause(),onStop();方法,当回到当前activity时,会执行onRestart();onstart();onResume();方法。

4、当用户退出当前activity时会执行onPause();onStop();最后执行onDestroy();方法。

三、程序示例解释说明

 

  1 package org.david.activitylifecycle;
  2 
  3 import android.os.Bundle;
  4 import android.app.Activity;
  5 import android.content.Intent;
  6 import android.util.Log;
  7 import android.view.View;
  8 import android.view.View.OnClickListener;
  9 import android.widget.Button;
 10 
 11 public class MainActivity extends Activity implements OnClickListener {
 12 
 13     private static final String TAG = MainActivity.class.getSimpleName();
 14     private Button btn_next, btn_halfActivity;
 15 
 16     @Override
 17     protected void onCreate(Bundle savedInstanceState) {
 18         super.onCreate(savedInstanceState);
 19         Log.i(TAG, "onCreate()");
 20         setContentView(R.layout.activity_main);
 21 
 22         // init---view
 23         btn_next = (Button) findViewById(R.id.btn_next);
 24         btn_halfActivity = (Button) findViewById(R.id.btn_halfActivity);
 25         btn_next.setOnClickListener(this);
 26         btn_halfActivity.setOnClickListener(this);
 27 
 28     }
 29 
 30     @Override
 31     public void onClick(View v) {
 32         switch (v.getId()) {
 33         case R.id.btn_next:
 34             Intent intent = new Intent(this, SecondActivity.class);
 35             startActivity(intent);
 36             break;
 37         case R.id.btn_halfActivity:
 38             Intent intent2 = new Intent(this,HalfActivity.class);
 39             startActivity(intent2);
 40             break;
 41 
 42         }
 43     }
 44 
 45     @Override
 46     protected void onStart() {
 47         super.onStart();
 48         Log.i(TAG, "onstart()");
 49     }
 50 
 51     @Override
 52     protected void onRestart() {
 53         super.onRestart();
 54         Log.i(TAG, "onRestart()");
 55     }
 56 
 57     @Override
 58     protected void onResume() {
 59         super.onResume();
 60         Log.i(TAG, "onResume()");
 61     }
 62 
 63     @Override
 64     protected void onPause() {
 65         super.onPause();
 66         Log.i(TAG, "onPause()");
 67     }
 68 
 69     @Override
 70     protected void onStop() {
 71         super.onStop();
 72         Log.i(TAG, "onStop()");
 73     }
 74 
 75     @Override
 76     protected void onDestroy() {
 77         super.onDestroy();
 78         Log.i(TAG, "onDestroy()");
 79     }
 80 
 81     @Override
 82     protected void onRestoreInstanceState(Bundle savedInstanceState) {
 83         super.onRestoreInstanceState(savedInstanceState);
 84         Log.i(TAG, "onRestoreInstanceState()");
 85     }
 86 
 87     @Override
 88     protected void onNewIntent(Intent intent) {
 89         super.onNewIntent(intent);
 90         Log.i(TAG, "onNewIntent()");
 91     }
 92 
 93     @Override
 94     protected void onSaveInstanceState(Bundle outState) {
 95         super.onSaveInstanceState(outState);
 96         Log.i(TAG, "onSaveInstanceState()");
 97     }
 98     
 99 
100 }

1、当前activity启动:

2、当启动一个新的activity,或者按home键:

注意:onSaveInstanceState();方法在onStop()之前调用,在onPause()之后调用。

   这个地方与我之前看到过的一篇博客有出入,难道是sdk版本的问题?希望有知道的朋友给我解答下。

3、再次回到当前activity时,即由后台转到前台:

4、修改HalfActivity在AndroidManifest.xml中的配置,将android:theme属性设置为@android:style/Theme.Dialog。使之成为一个不全屏的activity。

有当前activity进入到HalfActivity:

 

再由HalfActivity退回当前activity:

5、当屏幕发生变化时,activity的生命周期也是会发生变化的。由竖屏----->横评和由横评----->竖屏生命周期的变化是一样的:

 

总结:理解生命周期对我们处理交互界面有大的帮助,同时也能使我们的程序更加的健壮。希望我们都能够有一个很好的理解。

补充:上篇中的activity的数据传递遗漏一种情况,这里补充一下:startActivityForResult(Intent, int);

MainActivity.java

1 Intent intent2 = new Intent(this,HalfActivity.class);
2             startActivityForResult(intent2, REQUEST_OK);
1     @Override
2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3         super.onActivityResult(requestCode, resultCode, data);
4         if(requestCode==REQUEST_OK){
5             String getData = data.getStringExtra("hello");
6             System.out.println(getData);
7         }
8     }

HalfActivity.java

1 tv_hello=(TextView) findViewById(R.id.tv_hello);
2         Intent intent = new Intent();
3         intent.putExtra("hello", tv_hello.getText().toString());
4         setResult(MainActivity.REQUEST_OK, intent);

 

感悟

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。