Activity橫豎屏切換生命週期
阿新 • • 發佈:2020-08-01
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_PORTRAIT
和Configuration.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