Android中Activity生命周期

转自:http://blog.csdn.net/sdlgxxy/article/details/6225926html

  在Android中,Activity的生命周期一直是 比较重要的知识点,即便是在面试中也常常被问到。网上已经有不少人写过介绍此内容的文章,本文只是本身的总结笔记,便于之后翻阅。首先上图:前端

上面那张让人看起来很爽的图就是官方文档中关于Activity生命周期的演示图,Activity共有七个生命周期方法,分别为:java

[c-sharp]  view plain copy
  1. void onCreate(Bundle savedInstanceState)  
  2. void onStart()  
  3. void onRestart()  
  4. void onResume()  
  5. void onPause()  
  6. void onStop()  
  7. void onDestroy()  
 

第一个方法很熟悉吧,当一个android应用启动时,首先就会去调用onCreate(),onStart(),onResume()方法,而后你就能够看到程序的主界面了,若是这时主界面失去了焦点,被另一个视图覆盖,则会触发onPause()和onStop()方法,再次返回时,又会依次触发onRestart(),onStart()和onResume()方法,原先的界面又从新显示。下面以一个例子具体演示一下。android

一、新建Android工程,包含一个按钮,能够启动另一个Activity,代码以下程序员

[java]  view plain copy
  1. package cn.xiyang.activity;  
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. public class MainActivity extends Activity {  
  9.       
  10.     private static final String TAG = "MainActivity";  
  11.       
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.         Button button = (Button) findViewById(R.id.button);  
  18.         button.setOnClickListener(new View.OnClickListener() {  
  19.               
  20.             public void onClick(View v) {  
  21.                 Intent intent = new Intent(MainActivity.this,OtherActivity.class);  
  22.                 startActivity(intent);  
  23.             }  
  24.         });  
  25.         Log.i(TAG, "onCreate");  
  26.     }  
  27.     @Override  
  28.     protected void onRestart() {  
  29.         Log.i(TAG, "onRestart");  
  30.         super.onRestart();  
  31.     }  
  32.     @Override  
  33.     protected void onResume() {  
  34.         Log.i(TAG, "onResume");  
  35.         super.onResume();  
  36.     }  
  37.     @Override  
  38.     protected void onPause() {  
  39.         Log.i(TAG, "onPause");  
  40.         super.onPause();  
  41.     }  
  42.     @Override  
  43.     protected void onDestroy() {  
  44.         Log.i(TAG, "onDestory");  
  45.         super.onDestroy();  
  46.     }  
  47.     @Override  
  48.     protected void onStart() {  
  49.         Log.i(TAG, "onStart");  
  50.         super.onStart();  
  51.     }  
  52.     @Override  
  53.     protected void onStop() {  
  54.         Log.i(TAG, "onStop");  
  55.         super.onStop();  
  56.     }  
  57.       
  58.       
  59. }  
 

上述代码生命周期方法中没有写具体的内容,为了观看效果,以log的形式打印出来,能够在LogCat中查看输出的内容。不要忘记在AndroidManifest.xml文件中声明OtherActivity面试

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="cn.xiyang.activity"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name=".MainActivity"  
  8.                   android:label="@string/app_name">  
  9.             <intent-filter>  
  10.                 <action android:name="android.intent.action.MAIN" />  
  11.                 <category android:name="android.intent.category.LAUNCHER" />  
  12.             </intent-filter>  
  13.         </activity>  
  14.         <activity android:name=".OtherActivity"  
  15.                 android:label="@string/other">  
  16.         </activity>  
  17.     </application>  
  18.     <uses-sdk android:minSdkVersion="8" />  
  19. </manifest>   
 

二、写好基本代码后,最好首先清理一下LogCat控制台,便于观察。启动以后看到如图所示界面app

同时控制台输出了以下几行信息:ide

其中红色方框中的信息为咱们想要注意的信息,此时点击主界面的按钮,启动另一个Activity,注意观察控制台输出:网站

能够看到调用了onPause和onStop方法,这里须要说明一下,若是启动的心得Activity并无彻底遮住前面的Activity,则不会触发onStop方法,自会触发onPause方法,这时MainActivity处于暂停状态,若是想要演示这种效果能够吧OtherActivity的Theme设置为Dialog实验一下(设置方法是在AndroidManifest.xml中Activity中添加android:theme="@android:style/Theme.Dialog",其余都不用改)。好,接着本程序而后点击键盘的返回键,返回到前一个页面,查看控制台输出:this

看到有调用了如上三个方法,这时再次点击返回按钮,退出程序,查看LogCat控制台:

这时调用了三个方法,退出了程序,Activity生命周期终结。经过上面的实验,咱们能够很是完整的理解Activity的生命周期,更好的看懂文章开始的图,同时加深对Activity生命周期的理解。

总结:

    1、在 android 中,Activity 拥有四种基本状态:

  1. Active/Runing一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
  2. Paused 当 Activity 被另外一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持链接,系统继续维护其内部状态,因此它仍然可见,但它已经失去了焦点故不可与用户交互。
  3. Stoped 当 Activity 被另一个 Activity 覆盖、失去焦点并不可见时处于 Stoped状态。
  4. Killed Activity 被系统杀死回收或者没有被启动时处于 Killed状态。

    Android 程序员能够决定一个 Activity 的“生”,但不能决定它的“死”,也就时说程序员能够启动一个 Activity,可是却不能手动的“结束”一个 Activity。当你调用 Activity.finish()方法时,结果和用户按下 BACK 键同样:告诉 Activity Manager 该 Activity 实例完成了相应的工做,能够被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity 并从新入栈,同时原 Activity 被压入到栈的第二层,从 Active 状态转到 Paused 状态。例如:从 Activity1 中启动了 Activity2,则当前处于栈顶端的是 Activity2,第二层是 Activity1,当咱们调用 Activity2.finish()方法时,Activity Manager 从新激活 Activity1 并入栈,Activity2 从 Active 状态转换 Stoped 状态,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被执行,Activity2 返回的数据经过 data参数返回给 Activity1。

    2、Activity栈

 

    Android 是经过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 老是在栈的顶端,当前台的 Activity 由于异常或其它缘由被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不一样状态间的转换。

 

 

参考文档:

 

相关文章
相关标签/搜索