2.3 安卓活動生命周期
標簽: Activity生命周期
理解活動的生命周期,有利于我們合理管理應用資源,寫出更加流暢的程序。
Android是使用任務Task來管理活動的,一個任務就是一組存放在棧里的活動的集合,這個棧成為返回棧BackStack,棧是一種先進后出的數據結構。
每個活動在其生命周期中最多有四種狀態
1、運行
活動位于棧頂時,這個活動就是運行狀態。
系統最不愿意回收這種活動。
2、暫停
活動不再處于棧頂,但是仍然可見時,這個活動處于暫停狀態,比如,活動上方有一個對話框(Activity形式的彈窗)彈出。
官方的解釋是:
onPause() Called when the system is about to start resuming another activity.
只有再啟動另外一個Activity的時候才會進入onPause狀態,而不是想象中的被覆蓋或者不可見
特別注意,只有在彈出的是一個活動形式的彈框時,才會對底層活動有影響,進入onPause()狀態,如果是Toast和AlertDialog彈窗則對底層活動無影響,同時通過AlertDialog源碼或者Toast源碼我們都可以發現它們實現的原理都是windowmanager.addView();來添加的, 它們都是一個個view ,因此不會對activity的生命周期有任何影響。
只有在內存極低的情況下,系統才回去考慮回收這種活動
3、停止
活動不再處于棧頂,且不可見時,就進入了停止狀態。
此時系統仍然會為這種活動保存響應的狀態和成員變量,但并不是完全可靠的,當其他地方需要內存時,這種狀態的活動有可能被系統回收。
4、銷毀
當一個活動從返回棧中移除后,就變成了銷毀狀態。
比如一個棧內先后存入活動1、2、3,當前處于活動3,點擊返回鍵返回活動2,則活動3執行onDestroy()
系統最傾向于回收這種狀態的活動。
Activity類中定義了7個回調方法供我們使用。
onCreate()
在活動第一次被創建的時候調用
我們應該在這個方法中完成活動的初始化操作,比如加載布局,綁定事件等等。
onStart()
在活動由不可見變為可見的時候調用
onResume()
在活動準備好與用戶交互的時候調用,此時活動處于返回棧的棧頂,并且處于運行狀態。
onPause()
在系統準備啟動或者恢復另外一個活動的時候調用
我們在這個方法中可以將一些消耗CPU的資源釋放掉,保存一些關鍵數據,這個方法執行速度一定要快,否則會影響新的棧頂活動的使用
onStop()
在活動完全不可見的時候調用
onStop()和onPause()的區別是,如果啟動的新活動是對話框活動,覆蓋了原有活動,但原有活動仍然可見,則執行的是onPause()
onDestroy()
活動被銷毀之前調用,之后活動變為銷毀狀態
onRestart()
活動由停止變為運行狀態之前調用,即活動被重新啟動
總結:
完整生存期
onCreate()到onDestroy()之間所經歷的就是完整生存期
可見生存期
onStart()到onStop()之間所經歷的就是可見生存期,對用戶是可見的
前臺生存期
onResume()到onPause()之間經歷的就是前臺生存期,這個周期活動總是處于運行狀態,與用戶進行交互。
活動生存周期圖見下圖
創建程序體驗Activity的生命周期
1、創建三個活動,分別是活動1、2、3,活動1為主活動,點擊活動1的按鈕啟動活動2,點擊活動2的按鈕啟動活動3
2、活動3中設置三個按鈕,分別可以啟動AlertDialog,Activity彈窗,Toast,觀察這幾個彈出窗口對底層活動3生命周期的影響
貼代碼:
活動1、2、3的XML代碼就不寫了,很簡單。
活動1Java代碼:
/**
* Created by RyShine on 2018/5/26.
* 1、點擊按鈕跳轉至下一頁,觀察該活動生命周期
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("MainActivity", "onCreate()");
setContentView(R.layout.activity_main);
Button act1st_btn = findViewById(R.id.act1st_btn);
act1st_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//顯示Intent啟動下一個活動
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.i("MainActivity", "onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.i("MainActivity", "onResume()");
}
@Override
protected void onPause() {
super.onPause();
Log.i("MainActivity", "onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.i("MainActivity", "onStop()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("MainActivity", "onRestart()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("MainActivity", "onDestroy()");
}
}
活動2的Java代碼:
/**
* Created by RyShine on 2018/5/26.
* 1、點擊按鈕跳轉至下一頁,觀察該活動生命周期
*/
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("SecondActivity", "onCreate()");
setContentView(R.layout.activity_second);
Button act2nd_btn = findViewById(R.id.act2nd_btn);
act2nd_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//隱式Intent啟動下一個活動
Intent intent = new Intent("com.ryshine.lifecycletest.start");
intent.addCategory("com.ryshine.lifecycletest.start");
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.i("SecondActivity", "onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.i("SecondActivity", "onResume()");
}
@Override
protected void onPause() {
super.onPause();
Log.i("SecondActivity", "onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.i("SecondActivity", "onStop()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("SecondActivity", "onRestart()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("SecondActivity", "onDestroy()");
}
}
活動3的Java代碼:
/**
* Created by RyShine on 2018/5/26.
* 1、點擊按鈕跳出彈窗,觀察該活動生命周期
* 2、注意兩種對話框對活動生命周期的影響
* AlertDiaolog、Toast對底層活動生命周期無影響
* 對話框式的活動對底層生命周期有影響
*/
public class ThirdActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("ThirdActivity", "onCreate()");
setContentView(R.layout.activity_third);
Button act3rd_btn = findViewById(R.id.act3rd_btn);
Button act3rd_btn2 = findViewById(R.id.act3rd_btn2);
Button act3rd_btn3 = findViewById(R.id.act3rd_btn3);
act3rd_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//新建一個對話框
AlertDialog.Builder dialog = new AlertDialog.Builder(ThirdActivity.this);
//設置對話框的標題
dialog.setTitle(R.string.dialog_title);
//設置對話框的信息
dialog.setMessage(R.string.dialog_tips);
//設置對話框可以由返回鍵關閉
dialog.setCancelable(true);
//顯示彈窗
dialog.show();
}
});
act3rd_btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//啟動一個對話框式的活動
Intent intent = new Intent(ThirdActivity.this, DialogActivity.class);
startActivity(intent);
}
});
act3rd_btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast彈窗
Toast.makeText(ThirdActivity.this, "這是Toast!", Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.i("ThirdActivity", "onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.i("ThirdActivity", "onResume()");
}
@Override
protected void onPause() {
super.onPause();
Log.i("ThirdActivity", "onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.i("ThirdActivity", "onStop()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("ThirdActivity", "onRestart()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("ThirdActivity", "onDestroy()");
}
}
活動3中啟動的Activity式彈窗的Java代碼
package com.ryshine.lifecycletest;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
/**
* Created by RyShine on 2018/5/26.
*/
public class DialogActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
}
AndroidManifest中的代碼:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ryshine.lifecycletest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".SecondActivity"/>
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="com.ryshine.lifecycletest.start"/>
<!--必須加上category android:name="android.intent.category.DEFAULT",否則無法啟動該活動-->
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.ryshine.lifecycletest.start"/>
</intent-filter>
</activity>
<!--android:theme="@style/Theme.AppCompat.Dialog"這段代碼將此活動設置為對話框形式-->
<activity android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
</application>
</manifest>
程序運行gif及控制臺輸出
控制臺輸出
智能推薦
活動——活動的生命周期
返回棧 Android是使用任務(Task)來管理活動的,一個任務就是一組存放在棧里的活動的集合,這個棧被稱為返回棧(Back Stack)。 活動生存期 - onCreate():在活動第一次被創建時調用,完成活動的初始化操作,比如加載布局,和綁定事件等。 - onStart():在活動由不可見變為可見時調用。 - onResume():在活動準備和用戶交互的時候調用,此時活動一定位于棧的棧頂,...
安卓學習之Activity的生命周期
Activity的不同生命周期 官方文檔https://developer.android.google.cn/guide/components/activities/activity-lifecycle 1.onCreate 表示Activity正在創建中,初始化工作。 2.onRestart 表示Activity正在重新啟動,由不可見變成可以狀態時調用 3.onStart Act...
安卓基礎知識回顧------Activity生命周期
Activity生命周期 下面我要介紹的是Activity的七個狀態方法 然后附我代碼一篇: **onCreate(Bundle savedInstanceState) onStart() onResume() onPause() onStop() onDestroy() onRestart() **onCreate(Bundle savedInstanceState) Activity的初始化,...
安卓開發基礎入門------Activity生命周期
給自己做個筆記,溫故而知新! 學習安卓開發,首先必須知道它最基本的常見的四大組件:Activity,Service,ContentProvider,BroadcastReceiver;那么Activity是我們在開發中接觸到最多的組件,所以對它的生命周期一定要有足夠的理解,從它被創建到銷毀是怎樣一個過程,中間經歷了什么,在開發中對程序員來講是由有很大的幫助,就像做數學題,你要知道它的原理你才更容易...
02 安卓開發之生命周期
1 Activity四種狀態 Active/Running: Activity處于活動狀態,此時Activity處于棧頂,是可見狀態,可與用戶進行交互。 Paused: 當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化為Paused狀態。但我們需要明白,此時Activity只是...
猜你喜歡
安卓開發-Activity的生命周期+任務棧
《一:生命周期函數》 1:函數調用: 2:轉換界面時調用函數順序: 3:生命周期類型: 4:在AndroidManifest: 5.1:在Activity中配置(消除橫豎屏,屏幕大小,鍵盤隱藏對Activity生命周期的影響): 5.2:橫豎屏切換生命周期方法執行順序: 6:Activity生命周期圖: 《二:短信的草稿保存》 正常關閉退出Activity后,調用onDestotry(protec...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...