MainActivity.java
package com.example.testactivitylife; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { private static final String TAG = "MainActivity "; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, TAG + "onCreate()"); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); intent.setClass(this, Activity2.class); startActivity(intent); return super.onOptionsItemSelected(item); } @Override protected void onStart() { Log.d(TAG, TAG + "onStart()"); super.onStart(); } @Override protected void onRestart() { Log.d(TAG, TAG + "onRestart()"); super.onRestart(); } @Override protected void onResume() { Log.d(TAG, TAG + "onResume()"); super.onResume(); } @Override protected void onPause() { Log.d(TAG, TAG + "onPause()"); super.onPause(); } @Override protected void onStop() { Log.d(TAG, TAG + "onStop()"); super.onStop(); } @Override protected void onDestroy() { Log.d(TAG, TAG + "onDestroy()"); super.onDestroy(); } }
Activity2.java
package com.example.testactivitylife; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class Activity2 extends Activity { private static final String TAG = "Activity2 "; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, TAG + "onCreate()"); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override protected void onStart() { Log.d(TAG, TAG + "onStart()"); super.onStart(); } @Override protected void onRestart() { Log.d(TAG, TAG + "onRestart()"); super.onRestart(); } @Override protected void onResume() { Log.d(TAG, TAG + "onResume()"); super.onResume(); } @Override protected void onPause() { Log.d(TAG, TAG + "onPause()"); super.onPause(); } @Override protected void onStop() { Log.d(TAG, TAG + "onStop()"); super.onStop(); } @Override protected void onDestroy() { Log.d(TAG, TAG + "onDestroy()"); super.onDestroy(); } /** * 当点击菜单选项的时候执行 */ @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); intent.setClass(this, MainActivity.class); startActivity(intent); return super.onOptionsItemSelected(item); } }
解释一下代码:
在MainActivity.java里面,我重写了OnCreate(),OnStart(),OnResume(),OnPause(),OnStop(),OnDestory()函数,在函数体内添加了日志代码Log.d()。
Activity2.java,除了类名,其他都跟MainActivity一样,当然,intent.setClass(this, MainActivity.class);这句Activity跳转的也不一样。
程序启动后,当点击菜单的选项时,会跳转到Activity2,在Activity2点击菜单,会跳转到MainActivity。
注意哦,我这里跳转Flag设定的是:
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);表示,如果已经有一个Activity的实例在运行,那么就将这个实例弄到最前台,即用户可以看见。如果没有的话就创建一个。
Log类是Android用来记录日志用的,你可以简单认为是一个System.out.println(),Log有很多级别,比如说警告,错误,信息,调试等等。
11-13 12:20:51.410: D/MainActivity(605): MainActivity onCreate() 11-13 12:20:51.410: D/MainActivity(605): MainActivity onStart() 11-13 12:20:51.420: D/MainActivity(605): MainActivity onResume()由此可见创建Activity 的顺序是:OnCreate()->OnStart()->OnResume()->Activity正在运行,用户可见。
此时,app的Activity栈(保存程序的所有的启动的activity,栈的结构可以百度一下)只有MainActivity一个成员。
11-13 13:34:01.312: D/MainActivity(287): MainActivity onPause() 11-13 13:34:01.381: D/Activity2(287): Activity2 onCreate() 11-13 13:34:01.381: D/Activity2(287): Activity2 onStart() 11-13 13:34:01.381: D/Activity2(287): Activity2 onResume() 11-13 13:34:01.732: D/MainActivity(287): MainActivity onStop()
activity切换的步骤是,原来的activity OnPause()->新的activity OnCreate()->OnStart()->OnResume()->新的Activity正在运行,用户可见->原来的activity OnStop(),
从上面可以看到原来的那个Activity最后的一个步骤是OnStop(),但是为什么很多资料都说要在OnPause()里面作activity的保存工作呢?
这是因为在新的Activity OnCreate的时候,如果内存不足,系统有可能会将原来的Activity给KILL掉,这样,原来的Activity就没有机会执行OnStop()和OnDestory()了,所以,大家记得要在OnPause里面作保存工作哦。
此时,系统的activity栈已经有两个activity了,最上面的那个是activity2,即用户看见的那个,最下面那个是MainActivity。
好了,现在我们在Activity2点击返回按钮,会发生什么呢?
11-13 13:35:50.351: D/Activity2(287): Activity2 onPause() 11-13 13:35:50.464: D/MainActivity(287): MainActivity onRestart() 11-13 13:35:50.464: D/MainActivity(287): MainActivity onStart() 11-13 13:35:50.464: D/MainActivity(287): MainActivity onResume() 11-13 13:35:50.872: D/Activity2(287): Activity2 onStop() 11-13 13:35:50.872: D/Activity2(287): Activity2 onDestroy()顺序大家都看的清楚,重要的一点事,在我们按返回的时候,activity2被系统destory了,所以,android规则是,按返回=销毁当前activity,返回activity栈里的下一个activity,我们这里是MainActivity。
这个和2.3的区别是,在2.3我们是按返回,回到MainActivity的,在这里我们是自己切换过去的,由于我们设置activity切换的FLAG是FLAG_ACTIVITY_REORDER_TO_FRONT。这表示在切换activity的时候,如果原来这个activity已经启动过,那么就将这个activity提到最前面来(用户可见),而不是又重新再创建一个,不同的FLAG会有不同的效果。
11-13 13:43:40.791: D/Activity2(287): Activity2 onPause() 11-13 13:43:40.841: D/MainActivity(287): MainActivity onRestart() 11-13 13:43:40.841: D/MainActivity(287): MainActivity onStart() 11-13 13:43:40.855: D/MainActivity(287): MainActivity onResume() 11-13 13:43:41.112: D/Activity2(287): Activity2 onStop()用这种方法,activity2不会被系统destory掉,现在app的activity栈结构是,Activity2在最下面,最上面的是MainActivity,
在种情况下按返回会有什么效果?根据上面的经验,应该是返回到activity栈的下面一层,即activity2,对吗?
11-13 13:45:41.931: D/MainActivity(287): MainActivity onPause() 11-13 13:45:42.031: D/Activity2(287): Activity2 onRestart() 11-13 13:45:42.031: D/Activity2(287): Activity2 onStart() 11-13 13:45:42.031: D/Activity2(287): Activity2 onResume() 11-13 13:45:42.441: D/MainActivity(287): MainActivity onStop() 11-13 13:45:42.441: D/MainActivity(287): MainActivity onDestroy()我们的结论是正确的,我们可以看到,最上面的Activity(MainActivity)被Destory了,现在app就只有一个Activity2保存在activity栈里面了。
我们再按一次返回会有什么效果?
11-13 13:47:10.356: D/Activity2(287): Activity2 onPause() 11-13 13:47:11.033: D/Activity2(287): Activity2 onStop() 11-13 13:47:11.033: D/Activity2(287): Activity2 onDestroy()
通过上面的分析,我们可以得到的结论有:
对于一个Activity生命周期有:
OnCreate()->OnStart()->OnResume()->运行->OnPause()->OnStop()->OnDestory()
其中在OnStop()的时候可以被重新启动OnStop()->OnRestart()->OnStart()->OnResume()......
通过按返回键我们可以当前的activity(其实也可以调用Destory方法),在调用完所有activity的destory方法后,程序退出。