Android四大组件之——Activity的生命周期(图文详解)

      转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai

      联系方式:[email protected]

      [Android四大组件学习系列Activity篇]

      1.Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

      2.Android四大组件之——Activity的生命周期(图文详解)

     上一篇文章讲了Activity的定义、状态和后退栈,现在讲讲Activity的重点和难点——Activity的生命周期。

 

  • Activity生命周期的回调方法:

     

//创建Activity

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

    }

//Activity快要变成可见的

    @Override

    protected void onStart() {

        super.onStart();

    }

//Activity变成可见的,处于运行状态

    @Override

    protected void onResume() {

        super.onResume();

    }

//其他Activity获得用户焦点,(Activity快要暂停了)

    @Override

    protected void onPause() {

        super.onPause();

    }

//Activity不再可见,处于停止状态

    @Override

    protected void onStop() {

        super.onStop();

    }

//Activity快要被销毁了

    @Override

    protected void onDestroy() {

        super.onDestroy();
}

 

       这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)
 
        1.Activity的entire lifetime(全部的生命期)发生在
                              调用onCreate()和调用onDestory()之间。
        在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
       
 
       2.Activity的visible lifetime(可见的生命期)发生在
                              调用onStart()onStop()之间。
         在这个期间,用户能在屏幕上看见Activity,和它进行交互。
        系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
 
      3Activity的foreground lifetime (前台的生命期)发生在
                               调用onResume()onPause()之间。
       在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
       一个Activity能频繁的在前台进入和出去之间转变。
 

       下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:

       

      

       下面通过一个Demo来学习以下Activity的生命周期:

      Demo很简单,就只有两个Activity,MainActivity和SecondActivity和一个按钮。点击按钮,由MainActivity跳转到SecondActivity。

      MainActivity:

 1 package com.example.activitytest;

 2 

 3 import android.app.Activity;

 4 import android.content.Intent;

 5 import android.os.Bundle;

 6 import android.util.Log;

 7 import android.view.View;

 8 import android.view.View.OnClickListener;

 9 import android.widget.Button;

10 

11 public class MainActivity extends Activity {

12   

13     private Button btn;

14     private static final String TAG = "ActivityTest";

15     @Override

16     protected void onCreate(Bundle savedInstanceState) {

17         super.onCreate(savedInstanceState);

18         Log.d(TAG, "MainActivity onCreate");

19         setContentView(R.layout.activity_main);

20         btn = (Button)findViewById(R.id.btn);

21         btn.setOnClickListener(new OnClickListener() {

22             

23             @Override

24             public void onClick(View v) {

25                    Intent intent = new Intent(MainActivity.this,SecondActivity.class);

26                    startActivity(intent);

27             }

28         });

29         

30     }

31     @Override

32     protected void onPause() {

33         Log.d(TAG, "MainActivity onPause  ");

34         super.onPause();

35     }

36     @Override

37     protected void onResume() {

38         Log.d(TAG, "MainActivity onResume  ");

39         super.onResume();

40     }

41     @Override

42     protected void onStart() {

43         super.onStart();

44         Log.d(TAG,"MainActivity onStart  ");

45     }

46     @Override

47     protected void onStop() {

48         super.onStop();

49         Log.d(TAG, "MainActivity onStop  ");

50     }

51     @Override

52     protected void onDestroy() {

53         super.onDestroy();

54         Log.d(TAG, "MainActivity onDestroy  ");

55     }

56     @Override

57     protected void onRestart() {

58         super.onRestart();

59         Log.d(TAG, "MainActivity onRestart  ");

60     }

61 }

   SecondActivity:

 

 1 package com.example.activitytest;

 2 

 3 import android.app.Activity;

 4 import android.os.Bundle;

 5 import android.util.Log;

 6 

 7 public class SecondActivity extends Activity {

 8     private static final String TAG = "ActivityTest";

 9        @Override

10     protected void onCreate(Bundle savedInstanceState) {

11            setContentView(R.layout.second_layout);

12            super.onCreate(savedInstanceState);

13            Log.d(TAG,"SecondActivity onCreate");

14            

15     }

16        @Override

17     protected void onStart() {

18         super.onStart();

19         Log.d(TAG, "SecondActivity onStart");

20     }

21        @Override

22     protected void onResume() {

23         super.onResume();

24         Log.d(TAG, "SecondActivity onResume");

25   

26        }

27      @Override

28     protected void onPause() {

29         super.onPause();

30         Log.d(TAG, "SecondActivity onPause");

31     }

32      @Override

33     protected void onStop() {

34         super.onStop();

35         Log.d(TAG, "SecondActivity onStop");

36     }

37      @Override

38     protected void onDestroy() {

39         super.onDestroy();

40         Log.d(TAG, "SecondActivity onDestroy");

41     }

42      @Override

43     protected void onRestart() {

44         super.onRestart();

45         Log.d(TAG, "SecondActivity onRestart");

46     }

47 }
SecondActivity

 

 使用Activity需要在Manifest.xml文件中注册:

 

 1 <?xml version="1.0" encoding="utf-8"?>

 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"

 3     package="com.example.activitytest"

 4     android:versionCode="1"

 5     android:versionName="1.0" >

 6 

 7     <uses-sdk

 8         android:minSdkVersion="8"

 9         android:targetSdkVersion="21" />

10 

11     <application

12         android:allowBackup="true"

13         android:icon="@drawable/ic_launcher"

14         android:label="@string/app_name"

15         android:theme="@style/AppTheme" >

16         <activity

17             android:name=".MainActivity"

18             android:label="@string/app_name" >

19             <intent-filter>

20                 <action android:name="android.intent.action.MAIN" />

21                  <category android:name="android.intent.category.LAUNCHER" />

22                 

23             </intent-filter>

24         </activity>

25         <activity

26             android:name=".SecondActivity"

27             android:label="SecondActivity"

28             android:theme="@android:style/Theme.Dialog"

29             >

30         </activity>

31     </application>
Manifest.xml

    1. 运行应用,MainActivity运行。

     可以看出一个Activity运行调用的回调方法是:onCreate()->onStart()->onResume()

  

    2. 点击跳转按钮,由MainActivity跳转到SecondActivity:

      1>SecondActivity是Dialog。

    

     由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。

     2>若将SecondActivity改为不是Dialog(只需在Manifest.xml文件中删掉 android:theme="@android:style/Theme.Dialog"这一行即可)

     再点击跳转按钮:

   

      对于MainActivity,由于不可见,状态由运行变为停止。

      依次调用了它的回调方法:onPause()->onStop()

      3.Activity处于运行状态时,点击返回按钮。

     

        点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法:onPause()->onStop()->onDestroy()

      4.Activity处于运行状态,点击主页按钮,返回桌面。

    

       Activity由运行状态变为停止状态,依次调用它的回调方法:onPause()->onStop()

       5.Activity处于停止状态,即由桌面返回到Activity。

       

        停止->运行,依次调用回调方法:onRestart()->onStart()->onResume()

      6.Activity处于运行状态,旋转屏幕:

      

        可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。

         运行->暂停->停止->死亡->运行

        依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()

 

          本人邮箱:[email protected],欢迎交流讨论。      

          欢迎转载,转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai

          如果喜欢,请点推荐!谢谢~

你可能感兴趣的:(Activity)