2019-09-17 18:51:21.639 26091-26091/? D/LifeActivity: --------onCreate:
2019-09-17 18:51:21.714 26091-26091/? D/LifeActivity: --------onStart:
2019-09-17 18:51:21.716 26091-26091/? D/LifeActivity: --------onResume:
複製代碼
2019-09-17 19:36:10.457 29902-29902/com.fr.myapplication D/LifeActivity: --------onPause:
2019-09-17 19:36:10.929 29902-29902/com.fr.myapplication D/LifeActivity: --------onStop:
複製代碼
2019-09-17 19:36:15.411 29902-29902/com.fr.myapplication D/LifeActivity: --------onRestart:
2019-09-17 19:36:15.412 29902-29902/com.fr.myapplication D/LifeActivity: --------onStart:
2019-09-17 19:36:15.413 29902-29902/com.fr.myapplication D/LifeActivity: --------onResume:
複製代碼
2019-09-17 19:36:10.457 29902-29902/com.fr.myapplication D/LifeActivity: --------onPause:
2019-09-17 19:36:10.929 29902-29902/com.fr.myapplication D/LifeActivity: --------onStop:
複製代碼
2019-09-17 19:40:09.387 29902-29902/com.fr.myapplication D/LifeActivity: --------onRestart:
2019-09-17 19:40:09.389 29902-29902/com.fr.myapplication D/LifeActivity: --------onStart:
2019-09-17 19:40:09.391 29902-29902/com.fr.myapplication D/LifeActivity: --------onResume:
複製代碼
Running / Paused / Stopped / Killedandroid
Activity處於活動狀態,此時Activity處於棧頂,是可見狀態,可與用戶進行交互。bash
當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化爲Paused狀態。此時Activity只是失去了與用戶交互的能力,其全部的狀態信息及其成員變量都還存在,只有在系統內存緊張的狀況下,纔有可能被系統回收掉。app
當一個Activity被另外一個Activity徹底覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時它再也不可見,可是跟Paused狀態同樣保持着其全部狀態信息及其成員變量。ide
當Activity被系統回收掉時,Activity就處於Killed狀態。佈局
咱們知道,Activity除了受用戶操做所致使的正常的生命週期方法的調度,還有一些異常狀況,好比當資源相關的系統配置發生改變以及系統內存不足時,Activity就可能被殺死。學習
例如當前的Activity處於豎屏狀態,若是忽然旋轉屏幕,因爲系統配置發生了改變,在默認的狀況下,Activity就會被銷燬而且從新建立,固然咱們能夠阻止系統從新建立咱們的Activity。 測試
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(TEXT,text);
Log.d(TAG, "--------onSaveInstanceState: ");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
text = savedInstanceState.getString(TEXT);
Log.d(TAG, "--------onRestoreInstanceState: ");
}
複製代碼
注意:系統只有在Activity異常終止的時候纔會調用onSaveInstanceState和onRestoreInstanceState來儲存和恢復數據,其餘狀況下不觸發這個過程動畫
Activity按照優先級從高到低,能夠分爲如下三種ui
當系統的內存不足時,系統會按照上述的優先級去殺死目標Activity所在的進程,並在後續經過onSaveInstanceState和onRestoreInstanceState來儲存和恢復數據。this
在AndroidManifest.xml中設置configChanges屬性的值可使系統配置發生變化後,Activity不被從新建立,以達到和onSaveInstanceState和onRestoreInstanceState來儲存和恢復數據同樣的效果。
<activity android:name=".LifeActivity"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
複製代碼
public class LifeActivity extends AppCompatActivity {
private static final String TAG = "LifeActivity";
private static final String TEXT = "text";
private EditText editText;
private String text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "--------onCreate: ");
setContentView(R.layout.activity_life);
editText = findViewById(R.id.et_text);
text = String.valueOf(editText.getText());
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "--------onStart: ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "--------onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "--------onStop: ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "--------onResume: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "--------onRestart: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "--------onDestroy: ");
}
public void click(View view) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(TEXT,text);
Log.d(TAG, "--------onSaveInstanceState: ");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
text = savedInstanceState.getString(TEXT);
Log.d(TAG, "--------onRestoreInstanceState: ");
}
}
複製代碼
其中的MainActivity,爲頁面內跳轉測試當前生命週期而存在,可爲任意一個Activity此處就不貼出代碼了
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activity學習.LifeActivity">
<Button
android:id="@+id/bt_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="點擊跳轉"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
tools:ignore="HardcodedText"
android:onClick="click"/>
<EditText
android:id="@+id/et_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:hint="輸入內容"
app:layout_constraintTop_toBottomOf="@id/bt_click"
android:inputType="text"
android:imeOptions="actionDone"/>
</androidx.constraintlayout.widget.ConstraintLayout>
複製代碼