android的七巧板activity的生命周期.docx
- 文档编号:9027291
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:15
- 大小:112.76KB
android的七巧板activity的生命周期.docx
《android的七巧板activity的生命周期.docx》由会员分享,可在线阅读,更多相关《android的七巧板activity的生命周期.docx(15页珍藏版)》请在冰点文库上搜索。
android的七巧板activity的生命周期
Android的七巧板Activity之一Activity的生命周期
2011-02-2723:
26:
35
标签:
Dialog Android Activity 生命周期 七巧板
版权声明:
原创作品,谢绝转载!
否则将追究法律责任。
说Activity是Android的七巧板,是因为,如果把Android的所有界面比作一副用用七巧板拼成的图画的话,那么每个Activity都相当于一块七巧板。
这个七巧板与他所在的package,所在的应用无关。
任何应用都可以把自己的七巧板拿出来让别人组装成他们的图画,自己也可以拿别的应用的七巧板来组装自己的图画。
现在开始我们的七巧板之旅!
这个专题总结一下Activity的生命周期。
好吧,先插一个document里的图片。
这个图是免不了的。
activity启动的时候:
onCreate--->onStart--->onResume这个过程不用多说,大家都知道。
这里主要讲讲:
何时onPause,何时onStop,何时onDestory;以及恢复的时候,何时onRestart,何时onResume。
为了方便说明这里把当前activity称为MainActivity,其他的activity称为SecondActivity、ThirdActivity等等。
通过上图的我们可以看出activity从running状态跳转到onPause状态的原因是:
Anotheractivitycomesintotheforeground.也就是说有另外一个actvity被启动并运行了,比如说MainActivity通过startActivity启动了SecondActivity,那么SecondActivity就在ui视图的最顶层了,而MainActivity不再是最顶层的activity了,此时就会onPause了,此时我们依稀还能看到MainActivity,只是MainActivity已经站在他人之后了。
而当MainActivity完全被SecondActivity挡住,完全看不见的时候,此时MainActivity就会onStop了。
我们看看上图从onPause到onStop的原因是:
theactivityisnolongervisiable.也就是说此时MainActivity完全不可见了,从这里我们可以猜测当按下home键的时候,当前activity就会处于onStop的状态。
从actvitiy的生命周期图中,我们可以看出activity是可以停留在onPause和onStop在这两个状态上的,因为可以相应的恢复。
那么何时停留在onPause,何时停留在onStop呢?
下图的MainActivity就是处于onPause状态:
因为这里的secondactvity是dialog样式:
name=".SecondActivity"android: theme="@android: style/Theme.Dialog"> 也就验证了当MainActivity不再在最顶端,但仍然可见的时候,MainActivity就处于onPause状态,此时如果退出(back键)secondactivity,那么MainActivity就会onResume。 下图的MainActivity就是处于onStop状态(注意,这里的thirdactivity是在MainActivity中通过startActivity启动的): 因为此时MainActivity已经完完全全被Thridactvity挡住了,完全不可见了,所以MainActivity处于onStop状态,如果此时退出Thridactivity(back键),那么MainActivity就会onRestart(). 何时onDestory呢? 当在MainActivity中按back键,退出时,最终就会走到onDestory,或者在代码中调用finish()的时候也会走到onDestroy这一步。 对于activity生命周期图的左侧部分: 当MainActivity处于onPause和onStop状态时,当更高优先级的apps需要内存,而此时系统内存不够了,那么android系统就会将MainActivity所在的进程给杀了以释放资源。 当然被杀了之后,想重生,那必须得从头来过: onCreate--->onStart()--->onResume(). 下面我们以实际例子来解释上图的Activity的生命周期。 我们新建一个工程,并建两个Activity,Activity1和Activity2。 我用的工具是IntellijIdea,(这里还是夸奖一下idea的人性化,在eclipse中建立Activity还需要在AndroidManifest.xml中手动注册一下,而是用idea,会发现,新建Activity后已经自动在AndroidManifest.xml中注册过了。 )两个Activity的代码如下: 1./**Activity1的代码*/ 2.public class Activity1 extends Activity { 3. private static final String TAG = "Activity1"; 4. 5. @Override 6. public void onCreate(Bundle savedInstanceState) { 7. Log.i(TAG, "Activity1 onCreate called! "); 8. super.onCreate(savedInstanceState); 9. setContentView(R.layout.main); 10. } 11. 12. @Override 13. protected void onStart() { 14. Log.i(TAG, "Activity1 onStart called! "); 15. super.onStart(); 16. } 17. 18. @Override 19. protected void onRestart() { 20. Log.i(TAG, "Activity1 onRestart called! "); 21. super.onRestart(); 22. } 23. 24. @Override 25. protected void onResume() { 26. Log.i(TAG, "Activity1 onResume called! "); 27. super.onResume(); 28. } 29. 30. @Override 31. protected void onPause() { 32. Log.i(TAG, "Activity1 onPause called! "); 33. super.onPause(); 34. } 35. 36. @Override 37. protected void onStop() { 38. Log.i(TAG, "Activity1 onStop called! "); 39. super.onStop(); 40. } 41. 42. @Override 43. protected void onDestroy() { 44. Log.i(TAG, "Activity1 onDestroy called! "); 45. super.onDestroy(); 46. } 47. /**当点击屏幕时,进入Activity2*/ 48. @Override 49. public boolean onTouchEvent(MotionEvent event) { 50. Intent intent = new Intent(this, Activity2.class); 51. startActivity(intent); 52. return super.onTouchEvent(event); 53. } 54.} 1./**Activity2的代码*/ 2.public class Activity2 extends Activity { 3. private static final String TAG = "Activity2"; 4. public void onCreate(Bundle savedInstanceState) { 5./**onCreated()是activity第一次被启动时执行的,主要是初始化一些变量*/ 6. Log.i(TAG, "Activity2 onCreate called! "); 7. setContentView(R.layout.main2); 8. super.onCreate(savedInstanceState); 9. } 10. 11. @Override 12. protected void onStart() { 13./**onStart()是activity界面被显示出来的时候执行的*/ 14. Log.i(TAG, "Activity2 onStart called! "); 15. super.onStart(); 16. } 17. 18. @Override 19. protected void onRestart() { 20./**onRestart()是当前activity重新被启动时调用的;绑定一些监听器等;*/ 21. Log.i(TAG, "Activity2 onRestart called! "); 22. super.onRestart(); 23. } 24. 25. @Override 26. protected void onResume() { 27./**onResume()是当该activity与用户能进行交互时被执行;*/ 28. Log.i(TAG, "Activity2 onResume called! "); 29. super.onResume(); 30. } 31. 32. @Override 33. protected void onPause() { 34./**onPause()是另一个activity被启动,当前的activity就被暂停了,一般在该函数中执行保存当前的数据*/ 35. Log.i(TAG, "Activity2 onPause called! "); 36. super.onPause(); 37. } 38. 39. @Override 40. protected void onStop() { 41./**onStop()表示另一个activity被启动完成时,当前activity对用户同时又完全不可见时才调用的*/ 42. Log.i(TAG, "Activity2 onStop called! "); 43. super.onStop(); 44. } 45. 46. @Override 47. protected void onDestroy() { 48./**onDestroy()是退出当前activity时调用的,当然如果程序中调用finish()或者说android系统当前资源不够用时就会被调用*/ 49. Log.i(TAG, "Activity2 onDestroy called! "); 50. super.onDestroy(); 51. } 52.} 然后我们在Activity1的layout文件中加入一个EditText 1. xml version="1.0" encoding="utf-8"? > 2. android=" 3. android: orientation="vertical" 4. android: layout_width="fill_parent" 5. android: layout_height="fill_parent" 6. > 7. 8. android: layout_width="fill_parent" 9. android: layout_height="wrap_content" 10. android: text="Hello World, Activity1" 11. /> 12. 13. 14. android: layout_width="fill_parent" 15. android: layout_height="50sp" 16. /> 17. 流程1 我们启动程序,进入Activity1,在Activity1的文本框中输入一段文字,然后按返回键,然后看Logcat里的调试信息。 02-2713: 38: 27.067: INFO/Activity1(566): Activity1onCreatecalled! 02-2713: 38: 27.157: INFO/Activity1(566): Activity1onStartcalled! 02-2713: 38: 27.157: INFO/Activity1(566): Activity1onResumecalled! 02-2713: 41: 08.107: INFO/Activity1(566): Activity1onPausecalled! 02-2713: 41: 08.897: INFO/Activity1(566): Activity1onStopcalled! 02-2713: 41: 08.897: INFO/Activity1(566): Activity1onDestroycalled! 从Log信息我们可以看出,进入Activity,然后按返回键退出。 Activity的生命周期经过里流程图上的竖直的路线。 onCreate->onStart->onPause->onStop->onDestroy。 这时的Activity寿终正寝。 当我们再次进入Activity1时,我们会发现,Activity1中的文本框的内容又成了空了,因此可以推断,Activity1内的空间已经被销毁,又重新生成了。 流程2 我们启动程序,进入Activity1,在Activity1内输入一段文本,点击Activity1,进入Activity2,然后Activity2中按返回键。 或者采用这个流程,启动程序进入Activity1,按Home键进入桌面,然后长按Home建点击该应用重新进入Activity1. 然后看Log信息。 02-2713: 55: 35.727: INFO/Activity1(600): Activity1onCreatecalled! 02-2713: 55: 35.837: INFO/Activity1(600): Activity1onStartcalled! 02-2713: 55: 35.837: INFO/Activity1(600): Activity1onResumecalled! 02-2713: 55: 40.287: INFO/Activity1(600): Activity1onPausecalled! 02-2713: 55: 41.227: INFO/Activity1(600): Activity1onStopcalled! 02-2714: 06: 43.017: INFO/Activity1(634): Activity1onRestartcalled! 02-2714: 06: 43.017: INFO/Activity1(634): Activity1onStartcalled! 02-2714: 06: 43.017: INFO/Activity1(634): Activity1onResumecalled! 从这个log信息,我们看出,当从Activity1进入Activity2时,Activity1经历的过程为onCreate->onStart->onResume->onPause->onStop->onRestart->onStart->onResume。 这个过程说明了图中,如果Activity完全被其他界面遮挡时,进入后台,并没有完全销毁,当再次进入该Activity时,onRestart->onStart->onResume,又重新恢复。 这说明充分说明了,斩草不除根,死灰也会复燃。 。 。 有点邪恶啊。 我们发现,从Activity2返回到Activity1时,Activity1内的文本并没有发生变化,因此可以推断,当ActivityonStop后其内的成员状态并没有改变。 是不是被所有的界面全部遮挡都会进入onStop呢? 我们看下面一个流程。 流程3 启动程序,进入Activity1,然后按挂机键,进入锁屏界面,然后从锁屏界面返回Activity1。 我们查看log信息。 02-2714: 17: 45.257: INFO/Activity1(810): Activity1onCreatecalled! 02-2714: 17: 45.347: INFO/Activity1(810): Activity1onStartcalled! 02-2714: 17: 45.347: INFO/Activity1(810): Activity1onResumecalled! 02-2714: 17: 51.177: INFO/Activity1(810): Activity1onPausecalled! 02-2714: 18: 04.757: INFO/Activity1(810): Activity1onResumecalled! 从log信息可以看出,Activity1被锁屏界面全部遮挡后并没有进入onStop,而仅仅进入onPause后就停止了,当从锁屏界面返回Activity1时,调用了onResume。 锁屏界面为什么会特殊呢,因为我们知道,进入onPause后,Activity始终还是活动的,再次onResume是不需要什么花费的,可以频繁的onPause,onResume;而onStop,onStart就会有比较多的花费。 为了保障锁屏返回后,原先顶部的Acitivtiy能够快速的返回到原来的状态,显然锁屏界面进行了特殊的处理。 同样,EditText的文本也没有发生变化,因此onPause也没有改变Activity内成员的状态。 流程4 我们在AndroidManifest.xml中将Activity2加入一个属性android: theme="@android: style/Theme.Dialog" 1. name=".Activity2" 2. android: label="Activity2" 3. android: theme="@android: style/Theme.Dialog"/> 这样Activity2在运行时就会以对话框的样式来运行了。 所以我们首先点击程序进入Activity1,在EditText中输入一段文本,点击Activity1进入Activity2,然后按返回键返回Activity1。 我们看log信息为: 02-2715: 13: 56.467: INFO/Activity1(962): Activity1onCreatecalled! 02-2715: 13: 56.567: INFO/Activity1(962): Activity1onStartcalled! 02-2715: 13: 56.567: INFO/Activity1(962): Activity1onResumecalled! 02-2715: 14: 09.197: INFO/Activity1(962): Activity1onPausecalled! 02-2715: 20: 50.607: INFO/Activity1(962): Activity1onResumecalled! 从log信息我们可以看出,当Activity被部分遮挡时,Activity进入onPause,并没有进入onStop,从Activity2返回后,执行了onResume,而且和我们想的一样,EditText的文本没有发生变化。 流程5 将Activity1的onTouchEvent函数进行修改,如下: 1.@Override 2.pu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 七巧板 activity 生命周期