1. 程式人生 > 實用技巧 >Activity橫豎屏切換生命週期

Activity橫豎屏切換生命週期

Activity橫豎屏切換生命週期

/**
* onCreate : 建立activity時呼叫。設定在該方法中,還以Bundle中可以提出用於建立該 Activity 所需的資訊
* onStart : activity變為在螢幕上對使用者可見時,即獲得焦點時,會呼叫
* onResume : activity開始與使用者互動時呼叫(無論是啟動還是重新啟動一個活動,該方法總是被呼叫的)
* onPause : activity被暫停或收回cpu和其他資源時呼叫,該方法用於儲存活動狀態的
* onStop : activity被停止並轉為不可見階段及後續的生命週期事件時,即失去焦點時呼叫
* onDestroy : activity被完全從系統記憶體中移除時呼叫,該方法被呼叫可能是因為有人直接呼叫 finish()方法 或者系統決定停止該活動以釋放資源
*
* onSaveInstanceState : 不是生命週期方法,只有在由系統銷燬一個Activity時,會被呼叫
* onRestoreInstanceState : 不是生命週期方法,只有在activity被系統回收,重新建立activity的情況下才會被呼叫
* onConfigurationChanged : 不是生命週期方法,當系統的配置資訊發生改變時,系統會呼叫此方法
*
*/

一、螢幕橫豎屏切換的程式碼

豎屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

橫屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

獲得當前螢幕狀態

getResources().getConfiguration().orientation

此狀態可為:Configuration.ORIENTATION_PORTRAITConfiguration.ORIENTATION_LANDSCAPE

二、橫豎屏切換Activity生命週期回撥

橫豎屏屬性可以在AndroidManifest.xml中設定,也可以在MainActivity.java中進行設定(上面已經提及)。

本節主要講解在AndroidManifest.xml中的設定

<activity android:name=".MainActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="portrait">
</activity>

(一)configChanges屬性

設定configChanges這個值可以避免Activity生命週期被回到。該部分具體的引數:

  • orientation:螢幕在縱向和橫向間旋轉
  • keyboardHidden:鍵盤顯示或隱藏
  • screenSize:螢幕大小改變
  • fontScale:使用者變更了首選字母大小
  • locale:使用者選擇了不同的語言設定
  • keyboard:鍵盤型別變更,如手機從九宮格鍵盤變為全鍵盤
  • touchscreen或navigation:鍵盤或導航方向變換,一般不會發生這種情況。

前面三個是常用的,後面屬性很少使用

如果要activity中的生命週期不回撥,就要設定:

android:configChanges="orientation|keyboardHidden|screenSize"

缺少其中任一一個都會Activity生命週期回撥,即如下情況:

不發生回撥是如下情況:

在這附上對應的程式碼:

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");

        Button bt = (Button)findViewById(R.id.bt_skip_other_activity);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                else
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        });
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i(TAG, "onConfigurationChanged");
        initChange();
    }

    private void initChange(){
        if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
            Log.i(TAG, "螢幕改變,當前為豎屏");
        else
            Log.i(TAG, "螢幕改變,當前為橫屏");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume");
    }

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState");
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "onRestoreInstanceState");
    }
}

==================End