什么是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(); } }
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哦!