一、Activity生命周期说明
Activity的四种状态:
⒈活动状态(Active or Running):也称为运行状态,处于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);
感悟