Activity的生命周期

什么是Activity? Activity是android四大组件之一,它在android设备上往往被用做一屏幕显示,好比一个网页、一个窗口,但是Activity的实现原理和网页或窗口是不一样的。

看看Activity的类继承结构

java.lang.Object 
   ↳ android.content.Context 
     ↳ android.content.ContextWrapper 
       ↳ android.view.ContextThemeWrapper 
         ↳ android.app.Activity 
可以看出Activity是Context的子类,Context这个类的对象在android中是非常有用的,万能工具! 有了它就可以随意getXX了。

这里先来介绍一下Activity的生命周期,一般都是刚刚学android的时候才了解这些的,但是现在来总结的话,是因为想加深对Activity的了解。

看看SDK中Activity的生命周期图:


由图可以看出Activity的生命周期有7个分界点,分别是onCreate() 一个生命周期只执行本方法一次;onStart() 可多次执行;onResume() 可多次执行;onPause() 可多次执行;onStop() 可多次执行 ;onRestart() 可多次执行  ;onDestroy()  一个生命周期只能执行一次 ;这些分界点是有先后顺序的,图中可以看出有3个循环:

先看左边的循环条件:Otherr applications need memory(其他应用程序需要内存)也就是说android设备的内存不够用了,要把处于不可见状态的Activity清理一下腾出内存空间去做另外的事情,这个时候系统就会把这个Activity摧毁掉,再次回到这个Activity时,需要onCreate()重新来创建。


中间那个循环条件:The Activity comes to the foreground(该Activity又回到了前台)也就是又回到了该Activity,这个过程有点难实现,举个例子,有两个Activity,ActivityA和ActivityB,先启动ActivityA,然后再ActivityA启动后启动ActivityB等待ActivityB启动完成后,按返回键,回到ActivityA,这个过程中,他们的生命周期变化是:

A:onCreate-->A:onStart-->A:onResume(ActivityA 的启动和显示就完成了,在此时启动ActivityB)-->A:onSaveInstanceState-->A:onPause -->B:onCreate-->B:onStart-->B:onResume(ActivityB启动和显示完成,按返回键)-->B:onPause-->A:onRestart-->A:onStart-->A:onResume(此时ActivityA就显示完了)-->B:onStop-->B:onDestroy

看完了这个过程之后,发现这是第三个循环的内容,但是第二个循环为什么没有出现呢? 因为第二个循环很难实现! 从上面的过程可以看出,在A:onResume之后,启动ActivityB,ActivityA会先调用onSaveInstanceState方法保存数据,然后调用onStop方法,这是一个自动的过程,所以,我们要实现第二个循环所描述的生命周期的话,必须要在ActivityA没有调用onStop之前按返回键!这需要运气和手速, 这才是关键,所以说第二个循环所描述的生命周期比较难实现。


上面看到一个onSaveInstanceState这个方法被调用了,是的,它是用来保存Activity的数据的,程序猿可以在这个方法中去保存需要保存的数据,和这个方法对应的方法是

onRestoreInstanceState,这个方法的作用的恢复之前保存的数据。那他们分别在什么时候被调用呢?

onSaveInstanceState(): 该方法在Activity容易被摧毁的时候调用,比如ActivityA中启动ActivityB,ActivityA就会调用此方法,或者在ActivityA中按home键,也会调用此方法或者切换屏幕方向的时候也会调用此方法。

onRestoreInstanceState():该方法并不是和onSaveIntanceState()成对出现,该方法的调用前提是,Activity确实是被系统摧毁了! 

好,这里还是上上代码,虽然这代码有点简单。

ActivityLifeCycleActivity.java

package dxd.activitylifecycle.test;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;

public class ActivityLifeCycleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.e("A-->","onCreate()");
    }
    
    
    @Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
			startActivity(new Intent(ActivityLifeCycleActivity.this ,BActivity.class));
		}
		return super.onKeyDown(keyCode, event);
	}


	@Override
	public void onConfigurationChanged(Configuration newConfig) {
    	Log.e("A-->","onConfigurationChanged");
		super.onConfigurationChanged(newConfig);
	}

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

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

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

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		Log.e("A-->","onRestoreInstanceState()");
		super.onRestoreInstanceState(savedInstanceState);
	}

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

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		Log.e("A-->","onSaveInstanceState()");
		super.onSaveInstanceState(outState);
	}

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

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

BActivity.java

package dxd.activitylifecycle.test;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;

public class BActivity extends Activity {
	   @Override
	    public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.main);
	        Log.e("B-->","onCreate()");
	    }
	    
	   
	    @Override
		public void onConfigurationChanged(Configuration newConfig) {
	    	Log.e("B-->","onConfigurationChanged");
			super.onConfigurationChanged(newConfig);
		}

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

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

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

		@Override
		protected void onRestoreInstanceState(Bundle savedInstanceState) {
			Log.e("B-->","onRestoreInstanceState()");
			super.onRestoreInstanceState(savedInstanceState);
		}

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

		@Override
		protected void onSaveInstanceState(Bundle outState) {
			Log.e("B-->","onSaveInstanceState()");
			super.onSaveInstanceState(outState);
		}

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

		@Override
		protected void onStop() {
			Log.e("B-->","onStop()");
			super.onStop();
		}
}
这里就不写配置文件和布局文件了,别忘了在配置文件中注册BActivity哦!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值