activity的生命周期

来源:互联网 发布:c 语言入门经典 编辑:程序博客网 时间:2024/06/05 16:22
  • 前言:

Activity的生命周期不是自身控制的,而是由Android系统控制的。系统通过调用不同的方法,完成Activity不同状态的转换。本文将通过一个实例来帮助理解Activity生命周期。

本文要点:

1.理解生命周期

2.Activity状态扭转

  • 生命周期概述

先上图:

activity_lifecycle

这幅图已经很完整的描述了Activity的生命周期,以及状态转换。但这里针对上图做几点说明:

(1)Activity生命周期中,有很多种状态。其中包括Resumed(运行态,可见且可交互),Paused(暂停,部分可见但不可交互),Stoped(停止态,不可见),Destroyed/Killed(销毁)等;

(2)Entire Lifetime,完整的生命周期从调用onCreate()开始,直至调用onDestroy()结束;

(3)Visible Lifetime,生命周期中可见的阶段,发生在调用onStart()之后,onStop()之前。处于Resumed,或Paused态,在这期间Activity处于屏幕上;

(4)Foreground Lifetime,生命周期可交互的阶段,在调用onResume()之后,onPause()之前。在这期间,Activity显示在所有其他Activity之前,并获取输入焦点。

(5)Android系统通过调用onCreate()方法创建Activity实例.onDestroy()方法释放,关闭Activity;

(6)Android系统通过栈管理Activities,屏幕最前端的Activity位于栈顶。不在栈顶的Activity一般处于Paused状态,Stoped状态,或者Destroyed中的一种;

(7)实际应用中,我们通过重载Android生命周期中不同的方法,实现对不同状态下Activity的控制。如:我们可以重载onCreate()方法,实现对数据库的初始化;重写onDestroy(),执行删除数据库操作等。

  • 状态转换实例

为了便于理解,我简单的写了一个Demo,不明白Activity周期的朋友们,可以亲手实践一下,大家按照我的步骤来。

第一步:新建一个Android工程,我这里命名为MainActivity.再创建一个OtherActivity继承activity。

[java] view plaincopyprint?
  1. public class MainActivityextends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. System.out.println("MainActivity:----------------onCreate--");
  8. Button button=(Button) this.findViewById(R.id.button);
  9. button.setOnClickListener(new View.OnClickListener() {
  10. public void onClick(View v) {
  11. // TODO Auto-generated method stub
  12. Intent intent=new Intent(MainActivity.this,OtherActivity.class);
  13. startActivity(intent);
  14. }
  15. });
  16. }
  17. @Override
  18. protected void onStart() {
  19. super.onStart();
  20. // The activity is about to become visible.
  21. System.out.println("MainActivity:----------------onStart--");
  22. }
  23. @Override
  24. protected void onResume() {
  25. super.onResume();
  26. // The activity has become visible (it is now "resumed").
  27. System.out.println("MainActivity:----------------onResume--");
  28. }
  29. @Override
  30. protected void onPause() {
  31. super.onPause();
  32. // Another activity is taking focus (this activity is about to be "paused").
  33. System.out.println("MainActivity:----------------onPause--");
  34. }
  35. @Override
  36. protected void onStop() {
  37. super.onStop();
  38. // The activity is no longer visible (it is now "stopped")
  39. System.out.println("MainActivity:----------------onStop--");
  40. }
  41. @Override
  42. protected void onDestroy() {
  43. super.onDestroy();
  44. // The activity is about to be destroyed.
  45. System.out.println("MainActivity:----------------onDestroy--");
  46. }
  47. }
[java] view plaincopyprint?
  1. public class OtherActivityextends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.other);
  7. System.out.println("OtherActivity:----------------onCreate--");
  8. }
  9. @Override
  10. protected void onStart() {
  11. super.onStart();
  12. // The activity is about to become visible.
  13. System.out.println("OtherActivity:----------------onStart--");
  14. }
  15. @Override
  16. protected void onResume() {
  17. super.onResume();
  18. // The activity has become visible (it is now "resumed").
  19. System.out.println("OtherActivity:----------------onResume--");
  20. }
  21. @Override
  22. protected void onPause() {
  23. super.onPause();
  24. // Another activity is taking focus (this activity is about to be "paused").
  25. System.out.println("OtherActivity:----------------onPause--");
  26. }
  27. @Override
  28. protected void onStop() {
  29. super.onStop();
  30. // The activity is no longer visible (it is now "stopped")
  31. System.out.println("OtherActivity:----------------onStop--");
  32. }
  33. @Override
  34. protected void onDestroy() {
  35. super.onDestroy();
  36. // The activity is about to be destroyed.
  37. System.out.println("OtherActivity:----------------onDestroy--");
  38. }
  39. }

第三步:运行上述工程,效果图如下(没什么特别的):


核心在Logcat视窗里,我们打开应用时先后执行了onCreate()->onStart()->onResume三个方法,看一下LogCat视窗如下:


点击go按钮:


一定跳转到了 另一个activity界面,下面让我们看看logcat:

当点击go按钮后首先执行mainActivity的onPause 然后依次执行otherActivity的 onCreate() onStart() onResume()方法,当整个屏幕被另一个activity完全遮挡住了 调用mainActivity的onStop方法.

接下来点击back按钮:

这一次先是调用了otherActivity的onPuse方法,失去焦点,然后调用mainActivity的onStart onResume 接着就是otherActivity的停止,销毁。

从上面可以看出onCreate方法只调用一次,当一个activity失去焦点时,也就是不在最前端时调用onPause方法, 当整个activity不可见时,也就是完全被另一个activity覆盖时,会调用onStop方法。

下面再让我们看下上面的Activity生命周期图是不是就容易理解了,当失去焦点时调用onPause方法,重新获得焦点调用OnResume方法 这两个方法是相对的。完全被覆盖调用onStop方法,返回前端调用onStart方法。

然后在点击home键验证一下:

OK!

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天府e税忘记密码怎么办 未成年在外面没地方住怎么办? 半框眼镜片掉了怎么办 选修差0.5个学分怎么办 脱产考博社保卡怎么办 幼儿上课不认真听讲怎么办 手机恢复的音频文件打不开怎么办 高考志愿填报不记得密码怎么办 经济纠纷案被告没有证据怎么办 管家婆管理员密码忘记了怎么办 人离职了公司扣发工资怎么办? 美国给我们断网怎么办 sci发表后发现错误怎么办 pos机按键是英文怎么办 蔚县县医院慢病本怎么办 知网下载的论文乱码怎么办 被期刊网骗了怎么办? 缝针缝到神经上怎么办 单位有个事特别多的领导怎么办 网上申请公司核名核不下来怎么办 老公把小三晒朋友圈老婆该怎么办 小三怀孕不愿意打掉怎么办 小三怀孕了引产怎么办 小三发现小四小三发现小四后怎么办 七十岁老人肺癌还有小三样怎么办 留学出国学历公认证怎么办 学历认证报告弄丢了怎么办 想读大专没考上怎么办 学信网身份证被注册了怎么办 学信网手机号换了密保忘了怎么办 学信网手机号改了密保忘了怎么办 学信网手机号忘了密保也忘了怎么办 学信网账号被注销了怎么办 原味奶酪太难吃怎么办 cma年费太贵了怎么办 会计证3年没年检怎么办 幼师面试没有什么特长怎么办 电子学历注册表过期了怎么办 学信网查不到电子注册登记表怎么办 学历证书电子注册备案表过期怎么办 举报人对处理结果不满意怎么办