android activity的生命周期 以及橫豎屏切換

activityA和B A跳轉到B

1:在主配置文件中添加Bactivity,如果不想B在橫豎屏切換的時候導致activity的銷毀和重新創建;可在聲明activity中添加

android:configChanges="keyboardHidden|orientation"

[html] 
<!– android:configChanges="keyboardHidden|orientation" 禁止activity在橫豎屏的時候activity被重新創建或者重啟,導致數據丟失,在遊戲制作中尤為重要 –> 
       <activity 
           android:name=".DemoActivity" 
           android:configChanges="keyboardHidden|orientation" 
           android:theme="@android:style/Theme.Dialog" /> 
       <!– android:theme="@android:style/Theme.Dialog" 設置該activity的顯示樣式是一對話框的形式顯示 –> 

2:在A的配置文件中添加一個按鈕.和單擊事件

3:重寫A中父類的onCreate onDestroy onPause onRestart onResume onStart onStop 方法,並添加system.out的TAG

為瞭避免橫豎屏和以為一些異常導致activity的銷毀和數據丟失,就重寫onSaveInstanceState這個方法,該方法可以保存當前頁面因為異常導致的activity銷毀時候數據,然後在下載onCreate的時候調用這些數據就可以瞭,onCreate中的參數就是onSaveInstanceState方法的bundle對象

[java] 
package com.example.lifecycle; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
 
/**
 * 聲明周期: 一個對象被創建出來 到 被銷毀(或者垃圾回收)的這個過程中所必須的方法
 * 
 * @author w
 * 
 */ 
public class MainActivity extends Activity { 
    /**
     * A 激活下一個activity之前的頁面 B激活下一個activity之後的頁面<br>
     * 程序第一次被部署的時候,執行第一個activity的onCreate onStart onResume 方法<br>
     * 激活下一個activity 執行A的onPause B onCreate onStart onResume A的 onStop<br>
     * 在B中點擊返回按鈕執行B的finidsh onPause A的 onRestart onStart onResume B的 onStop
     * onDestroy<br>
     * 在A中點擊返回 執行 A的 finish onPause onStop onDestroy <br>
     * 在A中點擊home鍵 執行A的onPause onStop方法<br>
     */ 
    @Override 
    /**
     * activity第一次被創建的時候執行,可做一些初始化工作
     */ 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        System.out.println("main onCreate"); 
        int page = 0; 
        if (savedInstanceState != null) {// savedInstanceState 
                                            // 接收因異常回收頁面傳來的bundle值 
            page = savedInstanceState.getInt("page");// 取得傳來的bundle中的值 
        } 
        System.out.println("當前: " + page); 
    } 
 
    /**
     * click點擊事件
     */ 
    public void click(View view) { 
        Intent intent = new Intent(this, DemoActivity.class); 
        startActivity(intent); 
    } 
 
    @Override 
    public void finish() { 
        super.finish(); 
        System.out.println("main finish"); 
    } 
 
    @Override 
    /**
     * activity被銷毀的時候執行的方法
     */ 
    protected void onDestroy() { 
        super.onDestroy(); 
        System.out.println("main onDestroy"); 
    } 
 
    @Override 
    /**
     * 當界面失去焦點的時候
     */ 
    protected void onPause() { 
        super.onPause(); 
        System.out.println("main onPause"); 
    } 
 
    @Override 
    protected void onRestart() { 
        super.onRestart(); 
        System.out.println("main onRestart"); 
    } 
 
    @Override 
    /**
     * 界面的控件可以獲取焦點的時候
     */ 
    protected void onResume() { 
        super.onResume(); 
        System.out.println("main onResume"); 
    } 
 
    @Override 
    /**
     * 當界面可以被用戶可見,當用戶再次返回該activity的時候,可以用這個方法來做一些數據的更新
     */ 
    protected void onStart() { 
        super.onStart(); 
        System.out.println("main onStart"); 
    } 
 
    @Override 
    /**
     * 界面用戶完全不可見的時候調用,比如正在看視屏,來一電話,可以用該方法停止播放
     */ 
    protected void onStop() { 
        super.onStop(); 
        System.out.println("main onStop"); 
    } 
 
    @Override 
    /**
     * 當activity被異常銷毀(回收)的時候調用,如果是自適應屏幕,
     * 如果是一個閱讀器,在看的時候突然沒電瞭,就會調用這個方法,當下次調用者個頁面的時候,會調用onCreate方法,並把這個參數的bundle對象傳給oncreate方法,<br>
     * oncreate方法中的bundle參數就是該值
     */ 
    protected void onSaveInstanceState(Bundle outState) { 
        // TODO Auto-generated method stub 
        super.onSaveInstanceState(outState); 
        outState.putInt("page", 30); 
    } 
 

4:Bactivity代碼
[java] 
package com.example.lifecycle; 
 
import android.app.Activity; 
import android.os.Bundle; 
 
public class DemoActivity extends Activity { 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.demo); 
        System.out.println("demo onCreate"); 
    } 
 
    @Override 
    public void finish() { 
        super.finish(); 
        System.out.println("demo finish"); 
    } 
 
    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        System.out.println("demo onDestroy"); 
    } 
 
    @Override 
    protected void onPause() { 
        super.onPause(); 
        System.out.println("demo onPause"); 
    } 
 
    @Override 
    protected void onRestart() { 
        super.onRestart(); 
        System.out.println("demo onRestart"); 
    } 
 
    @Override 
    protected void onResume() { 
        super.onResume(); 
        System.out.println("demo onResume"); 
    } 
 
    @Override 
    protected void onStart() { 
        super.onStart(); 
        System.out.println("demo onStart"); 
    } 
 
    @Override 
    protected void onStop() { 
        super.onStop(); 
        System.out.println("demo onStop"); 
    } 

 

註意onSaveInstanceState方法的作用,可以保存activity在因為異常導致銷毀時候的數據,然後傳給onCreate方法,在做處理,就可以避免數據的錯亂,

例如 在看小數的時候切換瞭橫豎屏,在切換的時候會調用onCreate onStart onResume 那麼activity中的當前頁數就丟瞭,用得從新開始,如果重寫瞭onSaveInstanceState方法,把當前頁放到參數bundle中,在onCreate的時候,onCreate中的參數bundle就是onSaveInstanceState方法放進的bundle

在聲明的activity中添加  android:configChanges="keyboardHidden|orientation" 屬性 可以禁止activity在橫豎屏的時候activity被重新創建或者重啟,導致數據丟失,在遊戲制作中尤為重要

You May Also Like