活動的生命週期
1.前期準備
1.1創建三個活動 MainActivity,NormalActivity,DialogActivity
創建活動
在這裏我創建的是三個EmptyActivity,生成了三個對應的Layout
1.2爲Dialog添加主題
接下來要在配置文件Mainfest.xml內爲DialogActivity設置一個Dialog主題,這樣做的目的是爲了讓Dialog頁面在onStart進入onResume狀態後,跳轉前的頁面MainActivity能夠處於onPause的狀態。
<activity android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.Dialog">
android:Theme=
</activity>
1.3添加按鈕跳轉活動
然後我們在MainActivity的Layout中添加兩個按鈕,一個按鈕期望跳轉至普通活動另一個按鈕期望跳轉至Dialog活動
activity_main.xml文件如下:
<Button
android:id="@+id/normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打開新的普通活動" />
<Button
android:id="@+id/dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打開一個對話框式活動" />
效果如下:
1.4重寫方法,爲按鈕綁定監聽事件
接下來要在MainActivity.class內爲按鈕綁定監聽事件進行頁面跳轉,並且我們要重寫onCreat()/onStrat()/onStop()/onPause()/onDestroy()和onResume(),另外兩個頁面對方法重寫如法炮製
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG,"onCreate");
Button normal_button=findViewById(R.id.normal);
normal_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,NormalActivity.class);
startActivity(intent);
}
});
Button dialog_button=findViewById(R.id.dialog);
dialog_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,DialogActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart()
{
super.onStart();
Log.d(TAG,"onStrat");
}
@Override
protected void onPause()
{
super.onPause();
Log.d(TAG,"onPause");
}
@Override
protected void onResume()
{
super.onResume();
Log.d(TAG,"onResume");
}
@Override
protected void onStop()
{
super.onStop();
Log.d(TAG,"onStop");
}
@Override
protected void onDestroy()
{
super.onDestroy();
Log.d(TAG,"onDestory");
}
@Override
protected void onRestart()
{
super.onRestart();
Log.d(TAG,"onRestart");
}
}
重寫好後準備工作就完成啦,可以運行程序並觀察Logcat啦
2.運行並觀察結果
當運行程序後彈出界面MainActivity
此時在Logcat中可以看到如下信息:
2020-03-15 01:45:05.332 11016-11016/com.example.javaproject D/MainActivity: onCreate
2020-03-15 01:45:05.464 11016-11016/com.example.javaproject D/MainActivity: onStrat
2020-03-15 01:45:05.473 11016-11016/com.example.javaproject D/MainActivity: onResume
onCreate說明MainActivity創建活動完畢,接下來進入到onStart的啓動階段,然後進入到onResume階段,在該階段下我們在程序內可以看到界面。也就是開始和用戶進行交互,此時該頁面處於棧頂。
然後我們點擊第一個按鈕點擊該按鈕後,期望進入到新的活動中,新的活動NormalActivity能夠完全遮擋住MainActivity
成功進入新頁面,此時在logcat中追蹤MainActivity的信息和NormalActivity的信息
2020-03-15 01:55:25.220 12500-12500/com.example.javaproject D/MainActivity: onStop
此時MainActivity處於onStop停止狀態
觀察一下NormalActivity的信息
2020-03-15 01:55:24.948 12500-12500/com.example.javaproject D/NormalActivity: onCreat
2020-03-15 01:55:24.951 12500-12500/com.example.javaproject D/NormalActivity: onStrat
2020-03-15 01:55:24.960 12500-12500/com.example.javaproject D/NormalActivity: onResume
此時NormalActivity和MainActivity一樣經歷了onCreat,onSrarr和onResume
接下來點擊返回到MainActivity
回到了最初的頁面
此時Logcat追蹤NormalActivity顯示
2020-03-15 01:58:18.683 12500-12500/com.example.javaproject D/NormalActivity: onStop
2020-03-15 01:58:18.685 12500-12500/com.example.javaproject D/NormalActivity: onDestory
NormalActivity停止並銷燬,這個過程是將該活動出棧,此時MainActivity重新置於棧頂
2020-03-15 01:59:02.842 12500-12500/com.example.javaproject D/MainActivity: onRestart
2020-03-15 01:59:02.844 12500-12500/com.example.javaproject D/MainActivity: onStrat
2020-03-15 01:59:02.846 12500-12500/com.example.javaproject D/MainActivity: onResume
MainActivity onReatart並重復onStart和onResume階段
那麼如果我們點擊Dialog會發生什麼呢?
點擊按鈕後DilogActivity的Logcat顯示如下:
2020-03-15 02:02:09.659 12500-12500/com.example.javaproject D/DialogActivity: onCreate
2020-03-15 02:02:09.661 12500-12500/com.example.javaproject D/DialogActivity: onStrat
2020-03-15 02:02:09.667 12500-12500/com.example.javaproject D/DialogActivity: onResume
不多贅述
但是我們觀察MainActivity的Logcat它會顯示什麼呢?
2020-03-15 02:04:09.688 13556-13556/com.example.javaproject D/MainActivity: onResume
2020-03-15 02:04:11.801 13556-13556/com.example.javaproject D/MainActivity: onPause
這裏出現了onPause!
這就意味着目前MainActivity處於一個暫停狀態
爲什麼此時MainActivity處於暫停狀態,是因爲Dialog活動啓動並開始交互後並沒有完全佔據屏幕,此時MainActivity我們也可以看到但是無法進行交互,所以MainActivity處於Pause狀態。此時DialogActivity處於棧頂。
通過這個簡單的Demo,就可以簡單的瞭解活動的生命週期,瞭解活動的生命週期有助於我們在開發中寫出更加流暢的app。加油!!!!