一、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();方法。
三、程序示例解释说明
package org.david.activitylifecycle; import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener { private static final String TAG = MainActivity.class.getSimpleName();
private Button btn_next, btn_halfActivity; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate()");
setContentView(R.layout.activity_main); // init---view
btn_next = (Button) findViewById(R.id.btn_next);
btn_halfActivity = (Button) findViewById(R.id.btn_halfActivity);
btn_next.setOnClickListener(this);
btn_halfActivity.setOnClickListener(this); } @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_next:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
break;
case R.id.btn_halfActivity:
Intent intent2 = new Intent(this,HalfActivity.class);
startActivity(intent2);
break; }
} @Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onstart()");
} @Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart()");
} @Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume()");
} @Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause()");
} @Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop()");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy()");
} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onRestoreInstanceState()");
} @Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.i(TAG, "onNewIntent()");
} @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState()");
} }
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
Intent intent2 = new Intent(this,HalfActivity.class);
startActivityForResult(intent2, REQUEST_OK);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==REQUEST_OK){
String getData = data.getStringExtra("hello");
System.out.println(getData);
}
}
HalfActivity.java
tv_hello=(TextView) findViewById(R.id.tv_hello);
Intent intent = new Intent();
intent.putExtra("hello", tv_hello.getText().toString());
setResult(MainActivity.REQUEST_OK, intent);
感悟:北京已经连续一个星期的雾霾天气了,真心是让人感到心烦啊!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)