[Android開發學習22]Activity的聲明周期–Activity Lifecycle

一、基礎知識:

 

1.一個Activity的生命周期圖:

 

2.一個Activity的生命周期相關函數:

[java]
public class Activity extends ApplicationContext { 
     protected void onCreate(Bundle savedInstanceState); 
 
     protected void onStart(); 
      
     protected void onRestart(); 
 
     protected void onResume(); 
 
     protected void onPause(); 
 
     protected void onStop(); 
 
     protected void onDestroy(); 
 } 

public class Activity extends ApplicationContext {
     protected void onCreate(Bundle savedInstanceState);

     protected void onStart();
    
     protected void onRestart();

     protected void onResume();

     protected void onPause();

     protected void onStop();

     protected void onDestroy();
 }

3.一個Activity的生命周期相關函數的具體介紹:

Method Description Killable? Next
onCreate() Called when the activity is first created. This is where you should do all of your normal static set up: create views, bind data to lists, etc. This method also provides you with a Bundle containing the activity's previously frozen state, if there was one.
Always followed by onStart().
 No onStart()
  onRestart() Called after your activity has been stopped, prior to it being started again.
Always followed by onStart()
 No onStart()
onStart() Called when the activity is becoming visible to the user.
Followed by onResume() if the activity comes to the foreground, or onStop() if it becomes hidden.
 No onResume()or onStop()
  onResume() Called when the activity will start interacting with the user. At this point your activity is at the top of the activity stack, with user input going to it.
Always followed by onPause().
 No onPause()
onPause() Called when the system is about to start resuming a previous activity. This is typically used to commit unsaved changes to persistent data, stop animations and other things that may be consuming CPU, etc. Implementations of this method must be very quick because the next activity will not be resumed until this method returns.
Followed by either onResume() if the activity returns back to the front, or onStop() if it becomes invisible to the user.
 Pre-HONEYCOMB onResume()or
onStop()
onStop() Called when the activity is no longer visible to the user, because another activity has been resumed and is covering this one. This may happen either because a new activity is being started, an existing one is being brought in front of this one, or this one is being destroyed.
Followed by either onRestart() if this activity is coming back to interact with the user, oronDestroy() if this activity is going away.
 Yes onRestart()or
onDestroy()
onDestroy() The final call you receive before your activity is destroyed. This can happen either because the activity is finishing (someone called finish() on it, or because the system is temporarily destroying this instance of the activity to save space. You can distinguish between these two scenarios with theisFinishing() method. Yes nothing

這個表格的內容非常重要,必須全部理解。

上面三部分均引用自我們安裝的SDK文件夾內的文檔,我引用的具體位置是:

file:///D:/Program Files/android-sdk-windows__BACK/docs/reference/android/app/Activity.html#ActivityLifecycle

 (從D:\Program Files\android-sdk-windows\docs中的offline.html文件 進入)

 

 

 

 

二、代碼展示:

1."Activity_04\src\pinggle\activity_04\Activity_04.java"

[java]
package pinggle.activity_04; 
 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.app.Activity; 
import android.content.Intent; 
 
public class Activity_04 extends Activity { 
    private TextView myFirstText; 
    private Button  myButton; 
     
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        System.out.println(" FirstActivity –>> onCreate … "); 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_activity_04); 
         
        //根據控件的ID來取得代表控件的對象  
        myFirstText = (TextView)findViewById(R.id.myText); 
        myButton = (Button)findViewById(R.id.myButton); 
         
        // 為symbol和calculate設置顯示的值  
        myFirstText.setText(R.string.first_text); 
        myButton.setText(R.string.button_text); 
                 
        // 將監聽器的對象綁定到按鈕對象上面  
        myButton.setOnClickListener(new CalculateListener()); 
    } 
     
    class CalculateListener implements OnClickListener{ 
 
        @Override 
        public void onClick(View v) { 
            // TODO Auto-generated method stub  
            // 為另一個Activity構造Intent對象  
            Intent intent = new Intent(); 
            intent.setClass(Activity_04.this, SecondActivity.class); 
            // 使用這個Intent對象來啟動SecondActivity  
            Activity_04.this.startActivity(intent); 
        } 
         
    } 
     
    @Override 
    protected void onStart() { 
        // TODO Auto-generated method stub  
        System.out.println(" FirstActivity –>> onStart … "); 
        super.onStart(); 
    } 
     
    @Override 
    protected void onRestart() { 
        // TODO Auto-generated method stub  
        System.out.println(" FirstActivity –>> onRestart … "); 
        super.onRestart(); 
    } 
     
    @Override 
    protected void onResume() { 
        // TODO Auto-generated method stub  
        System.out.println(" FirstActivity –>> onResume … "); 
        super.onResume(); 
    } 
     
    @Override 
    protected void onPause() { 
        // TODO Auto-generated method stub  
        System.out.println(" FirstActivity –>> onPause … "); 
        super.onPause(); 
    } 
     
    @Override 
    protected void onStop() { 
        // TODO Auto-generated method stub  
        System.out.println(" FirstActivity –>> onStop … "); 
        super.onStop(); 
    } 
     
    @Override 
    protected void onDestroy() { 
        // TODO Auto-generated method stub  
        System.out.println(" FirstActivity –>> onDestroy … "); 
        super.onDestroy(); 
    } 

package pinggle.activity_04;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;

public class Activity_04 extends Activity {
 private TextView myFirstText;
 private Button myButton;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  System.out.println(" FirstActivity –>> onCreate … ");
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_activity_04);
  
  //根據控件的ID來取得代表控件的對象
  myFirstText = (TextView)findViewById(R.id.myText);
  myButton = (Button)findViewById(R.id.myButton);
  
  // 為symbol和calculate設置顯示的值
  myFirstText.setText(R.string.first_text);
  myButton.setText(R.string.button_text);
    
  // 將監聽器的對象綁定到按鈕對象上面
  myButton.setOnClickListener(new CalculateListener());
 }
 
 class CalculateListener implements OnClickListener{

  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   // 為另一個Activity構造Intent對象
   Intent intent = new Intent();
   intent.setClass(Activity_04.this, SecondActivity.class);
   // 使用這個Intent對象來啟動SecondActivity
   Activity_04.this.startActivity(intent);
  }
  
 }
 
 @Override
 protected void onStart() {
  // TODO Auto-generated method stub
  System.out.println(" FirstActivity –>> onStart … ");
  super.onStart();
 }
 
 @Override
 protected void onRestart() {
  // TODO Auto-generated method stub
  System.out.println(" FirstActivity –>> onRestart … ");
  super.onRestart();
 }
 
 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  System.out.println(" FirstActivity –>> onResume … ");
  super.onResume();
 }
 
 @Override
 protected void onPause() {
  // TODO Auto-generated method stub
  System.out.println(" FirstActivity –>> onPause … ");
  super.onPause();
 }
 
 @Override
 protected void onStop() {
  // TODO Auto-generated method stub
  System.out.println(" FirstActivity –>> onStop … ");
  super.onStop();
 }
 
 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  System.out.println(" FirstActivity –>> onDestroy … ");
  super.onDestroy();
 }
}
 

2."Activity_04\src\pinggle\activity_04\SecondActivity.java"

[java]
package pinggle.activity_04; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
 
public class SecondActivity extends Activity{ 
    private TextView mySecondText; 
     
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        System.out.println(" SecondActivity –>> onCreate … "); 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.second); 
         
        //根據控件的ID來取得代表控件的對象  
        mySecondText = (TextView)findViewById(R.id.mySecondText); 
         
        // 為symbol和calculate設置顯示的值  
        mySecondText.setText(R.string.second_text); 
    } 
     
    @Override 
    protected void onStart() { 
        // TODO Auto-generated method stub  
        System.out.println(" SecondActivity –>> onStart … "); 
        super.onStart(); 
    } 
     
    @Override 
    protected void onRestart() { 
        // TODO Auto-generated method stub  
        System.out.println(" SecondActivity –>> onRestart … "); 
        super.onRestart(); 
    } 
     
    @Override 
    protected void onResume() { 
        // TODO Auto-generated method stub  
        System.out.println(" SecondActivity –>> onResume … "); 
        super.onResume(); 
    } 
     
    @Override 
    protected void onPause() { 
        // TODO Auto-generated method stub  
        System.out.println(" SecondActivity –>> onPause … "); 
        super.onPause(); 
    } 
     
    @Override 
    protected void onStop() { 
        // TODO Auto-generated method stub  
        System.out.println(" SecondActivity –>> onStop … "); 
        super.onStop(); 
    } 
     
    @Override 
    protected void onDestroy() { 
        // TODO Auto-generated method stub  
        System.out.println(" SecondActivity –>> onDestroy … "); 
        super.onDestroy(); 
    } 

package pinggle.activity_04;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends Activity{
 private TextView mySecondText;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  System.out.println(" SecondActivity –>> onCreate … ");
  super.onCreate(savedInstanceState);
  setContentView(R.layout.second);
  
  //根據控件的ID來取得代表控件的對象
  mySecondText = (TextView)findViewById(R.id.mySecondText);
  
  // 為symbol和calculate設置顯示的值
  mySecondText.setText(R.string.second_text);
 }
 
 @Override
 protected void onStart() {
  // TODO Auto-generated method stub
  System.out.println(" SecondActivity –>> onStart … ");
  super.onStart();
 }
 
 @Override
 protected void onRestart() {
  // TODO Auto-generated method stub
  System.out.println(" SecondActivity –>> onRestart … ");
  super.onRestart();
 }
 
 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  System.out.println(" SecondActivity –>> onResume … ");
  super.onResume();
 }
 
 @Override
 protected void onPause() {
  // TODO Auto-generated method stub
  System.out.println(" SecondActivity –>> onPause … ");
  super.onPause();
 }
 
 @Override
 protected void onStop() {
  // TODO Auto-generated method stub
  System.out.println(" SecondActivity –>> onStop … ");
  super.onStop();
 }
 
 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  System.out.println(" SecondActivity –>> onDestroy … ");
  super.onDestroy();
 }
}

3."Activity_04\res\layout\activity_activity_04.xml"

[html]
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
 
   <TextView 
       android:id="@+id/myText" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@+string/hello_world" 
       /> 
 
    <Button 
        android:id="@+id/myButton" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        /> 
</LinearLayout> 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

   <TextView
       android:id="@+id/myText"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="@+string/hello_world"
       />

    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>
4."Activity_04\res\layout\second.xml"

[html]
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
     
   <TextView 
       android:id="@+id/mySecondText" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@+string/hello_world" 
       /> 
    
</LinearLayout> 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
   
   <TextView
       android:id="@+id/mySecondText"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="@+string/hello_world"
       />
  
</LinearLayout>
5."Activity_04\res\values\strings.xml"

[html]
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
 
    <string name="app_name">Activity_04</string> 
    <string name="hello_world">Hello world!</string> 
    <string name="menu_settings">Settings</string> 
    <string name="first_text">這是第一個Activity!</string> 
    <string name="button_text">點擊,跳轉到第二個Activity</string> 
    <string name="second_text">這是第二個Activity!</string> 
</resources> 

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

    <string name="app_name">Activity_04</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
 <string name="first_text">這是第一個Activity!</string>
 <string name="button_text">點擊,跳轉到第二個Activity</string>
 <string name="second_text">這是第二個Activity!</string>
</resources>
 

6.“Activity_04\AndroidManifest.xml”

[html]
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="pinggle.activity_04" 
    android:versionCode="1" 
    android:versionName="1.0" > 
 
    <uses-sdk 
        android:minSdkVersion="4" 
        android:targetSdkVersion="4" /> 
 
    <application 
        android:allowBackup="true" 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" 
        android:theme="@style/AppTheme" > 
        <activity 
            android:name="pinggle.activity_04.Activity_04" 
            android:label="@string/app_name" > 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
        <activity 
            android:name="pinggle.activity_04.SecondActivity" 
            android:label="@string/second_text" > 
        </activity> 
    </application> 
 
</manifest> 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pinggle.activity_04"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="4"
        android:targetSdkVersion="4" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="pinggle.activity_04.Activity_04"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="pinggle.activity_04.SecondActivity"
            android:label="@string/second_text" >
        </activity>
    </application>

</manifest>
 

 

 

 

三、效果展示:

 

首先啟動程序–>>

 

 

在調試信息處有如下打印語句:

 

 

 

然後點擊按鈕–>>

 

 

在調試信息處有如下打印語句:

 

 

 

按鍵盤的"返回"鍵–>>

 

 

在調試信息處有如下打印語句:

 

 

再按一次"返回"鍵,退出程序,有如下打印語句–>>

 

 

 

從上面的調試信息就可以看出整個Activity生命周期的流程瞭。。

 

 

如果想將第二個Activity的顯示改為對話框的形式,隻需修改"Activity_04\AndroidManifest.xml”中的如下內容:

[java]
<activity 
    android:name="pinggle.activity_04.SecondActivity" 
    android:label="@string/second_text"  
    android:theme="@android:style/Theme.Dialog" > 
</activity> 

        <activity
            android:name="pinggle.activity_04.SecondActivity"
            android:label="@string/second_text"
            android:theme="@android:style/Theme.Dialog" >
        </activity>
 效果如下:

 

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *