Android入門(五) | Activity 的生命周期

文章目錄

  • Activity 的狀態及生命周期
  • 實現管理生命周期
    • FirstActivity
    • SecondActivity
    • DialogActivity
    • 運行結果
  • 舊活動被回收了還能返回嗎?


Activity 的狀態及生命周期

Android 的應用程序運用 棧(Back Stack) 的思想來管理 Activity:

  • 每創建一個新活動,就會覆蓋在舊活動之上,相當于壓入棧。
  • 每當按下 返回鍵(Back) 或者調用 finish() ,就會銷毀棧頂的 Activity,相當于彈出棧。

Activity 有四種狀態:

  • 運行:在棧頂時運行。
  • 暫停:不再處于棧頂、但屏幕上可見時暫停。
  • 停止:不再處于棧頂且屏幕上不可見時停止。
  • 銷毀:彈棧后銷毀。

Activity 類定義了七個回調方法,覆蓋了整個 Activity 生命周期:

  • onCreate() :活動首次創建時;
  • onStart() :活動由不可見變為可見;
  • onResume() :活動位于棧頂且準備好與用戶交互;
  • onPause() :在系統準備去啟動或者恢復另一個活動時調用,通常會釋放一些占用 CPU 的資源,保存一些關鍵數據;
  • onStop() :活動完全不可見時調用,如果新活動不是對話框式則調用 onStop,否則調用 onPause
  • onDestroy() :將活動變為銷毀狀態;
  • onRestart() :將活動由停止變為運行。

在這里插入圖片描述


實現管理生命周期

創建三個 Activity 文件以實現研究生命周期。

FirstActivity

FirstActivity 中添加兩個按鈕分別實現啟動 普通活動對話框式活動,并添加七個生命周期方法:

public class FirstActivity extends AppCompatActivity {private static final String TAG = "FirstActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first_layout);Button button_normal = (Button)findViewById(R.id.button_normal);button_normal.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(FirstActivity.this,SecondActivity.class);startActivity(intent);}});Button button_dialog = (Button)findViewById(R.id.button_dialog);button_dialog.setOnClickListener((View view)->{Intent intent = new Intent(this, DialogActivity.class);startActivity(intent);});}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, "onStart: ");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume: ");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause: ");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop: ");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy: ");}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, "onRestart: ");}
}

first_layout.xml 實現 FirstActivity 的具體布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button_normal"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="normal"></Button><Buttonandroid:id="@+id/button_dialog"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="dialog"></Button></LinearLayout>

SecondActivity

SecondActivity 作為一個普通活動,供 FirstActivitybutton_normal 跳轉調用,其 button2 提供一個能撥號 10086 的 intent

public class SecondActivity extends AppCompatActivity {private static final String TAG = "SecondActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second_layout);Button button2 = findViewById(R.id.button_2);button2.setOnClickListener((View view)->{Intent intent = new Intent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);});}
}

second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SecondActivity"><Buttonandroid:id="@+id/button_2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="button_2"/></LinearLayout>

DialogActivity

創建 DialogActivity 文件,旨在實現一個對話框式的活動:

public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.dialog_layout);}
}

想要讓其實現對話框式,需要對其 activity 標簽做出如下修改:
在這里插入圖片描述

通過 android:theme 指定 DialogActivity 的主題。

PS: 書上是這么寫的 android:theme="@android:style/Theme.Dialog" ,這是 Activitytheme,但我們默認生成的 DialogActivity 繼承的是 AppCompatActivity,所以就要使用與其配合的 AppCompat 的 theme 才行。

dialog_layout.xml 文件設計布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="Dialog Activity"/></LinearLayout>

運行結果

點擊運行,首先顯示的是 FirstActivity 的界面:
在這里插入圖片描述

此時查看 logcat,生命周期執行到 onResume 階段:
在這里插入圖片描述
點擊 NORMAL 按鈕,跳轉到 SecondActivity 界面:
在這里插入圖片描述
因此 onPause() —— FirstActivity 啟動另外一個活動 SecondActivityonStop() —— SecondActivity 需要占滿整個屏幕,因此 FirstActivity 停止,都會被執行:
在這里插入圖片描述

按下 Back 鍵返回 FirstActivity 界面,觀察 logcat

在這里插入圖片描述
由于 FirstActivity 已經進入停止狀態,因此執行 onRestart():由停止變為運行,之后重新執行 onStart() :由不可見變為可見onResume :準備好與用戶交互。之所以不執行 onCreate() ,是因為 FirstActivity 沒有重新創建。

點擊 DIALOG 按鈕,跳轉到 DialogActivity 界面:在這里插入圖片描述
此時 logcat 只有一條日志信息:
在這里插入圖片描述
沒有調用 onPause() 是因為 DialogActivity 并沒有占滿整個屏幕,FirstActivity 只是進入了暫停狀態,沒有進入停止狀態。

同理按下 Back 鍵也只會執行 onResume() 方法,因為不用從停止狀態重新變為運行。
在這里插入圖片描述
最后在 FirstActivity 界面點擊 Back 鍵退出程序,會依次執行:
在這里插入圖片描述
之后便銷毀了 FirstActivity。


舊活動被回收了還能返回嗎?

A 活動啟動 B 活動,假如此時內存空間不足,系統將 A 活動進行回收了,這時點擊 Back 還能返回 A 嗎?

其實 A 還是會正常顯示的,只不過這時并不會執行 onRestart() 方法,而是執行 oncreate() 方法,A 會被重新創建一次。唯一的問題是 A 中暫存的臨時數據都丟失了。

Activity 中提供了一個 onSaveInstanceState 的回調方法,活動在被回收之前一定會調用該方法,從而解決活動被回收時臨時數據得不到保存的問題。

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);
}

將一些重要的臨時數據保存在 Bundle 中,然后在 onCreateBundle 變量中提取數據。

onCreateBundle 一般都為 null ,但是如果在活動被系統回收之前有通過 onSaveInstanceState() 方法來保存數據的話,這個參數就會帶有之前所保存的全部數據,我們只需要再通過相應的取值方法將數據取出即可。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443711.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443711.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android入門(六) | Activity 的啟動模式 及 生產環境中關于 Activity 的小技巧

文章目錄Activity 的啟動模式standardsingleTopsingleTasksingleInstance技巧了解當前界面是哪個 Activity隨時隨地退出程序啟動活動的最佳寫法Activity 的啟動模式 standard&#xff1a;默認的啟動方式&#xff0c;每次啟動一個活動都會重新創建singleTop&#xff1a;如果該活…

Android入門(七) | 常用控件

文章目錄TextView 控件&#xff1a;文本信息Button 控件&#xff1a;按鈕EditText 控件&#xff1a;輸入框ImageView 控件&#xff1a;圖片ProgressBar 控件&#xff1a;進度條AlertDialog 控件&#xff1a;提示框ProgressDialog 控件&#xff1a;帶有進度條的提示框TextView 控…

Android入門(八) | 常用的界面布局 及 自定義控件

文章目錄LinearLayout &#xff1a;線性布局android:layout_gravity &#xff1a;控件的對齊方式android:layout_weight&#xff1a;權重RelativeLayout &#xff1a;相對布局相對于父布局進行定位相對于控件進行定位邊緣對齊FrameLayout &#xff1a;幀布局Percent &#xff1…

Android入門(九)| 滾動控件 ListView 與 RecyclerView

文章目錄ListView內置類型的簡單運用定制數據類型提升效率點擊事件RecyclerView布局管理器點擊事件ListView 內置類型的簡單運用 由于手機屏幕空間有限&#xff0c;能夠一次性在屏幕上顯示的內容不多&#xff0c;當我們的程序有大量數據需要顯示的時候就可以借助 ListView 來…

關于“三門問題”的一些想法

三門問題&#xff08;Monty Hall problem&#xff09;亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論&#xff0c;大致出自美國的電視游戲節目Let’s Make a Deal。問題名字來自該節目的主持人蒙提霍爾&#xff08;Monty Hall&#xff09;。參賽者會看見三扇關閉了的門&#xf…

Android入門(10)| Fragment碎片詳解

文章目錄為什么要使用碎片&#xff08;Fragment&#xff09;實例布局文件FragmentActivity動態添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期為什么要使用碎片&#xff08;Fragment&#xff09; 我們在手機上看新聞可能是這樣的&#xff1a; Re…

Android開發(1) | Fragment 的應用——新聞應用

文章目錄Item&#xff1a;標題子項布局文件Java代碼標題碎片布局文件Java代碼新聞內容碎片布局文件Java代碼新聞內容活動布局文件Java代碼首界面布局文件Java代碼Item&#xff1a;標題子項 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整體異常處理

在實際的J2EE項目中&#xff0c;系統內部難免會出現一些異常&#xff0c;就如StrutsSpringHibernate項目&#xff1a;通常一個頁面請求到達后臺以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action層會調用業務邏輯層service&am…

Android入門(11)| 全局廣播與本地廣播

文章目錄廣播概念接收廣播動態注冊實例靜態注冊實例發送廣播發送標準廣播廣播的跨進程特性發送有序廣播本地廣播廣播概念 Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊&#xff0c;這樣該程序就只會接收到自己所關心的廣播內容&#xff0c;這些廣播可能是來自系…

Android開發(2) | 廣播 Broadcast 的應用——強制下線功能

文章目錄功能簡介關閉所有活動登陸界面發送強制下線的廣播廣播接收器AndroidManifest.xml運行結果功能簡介 強制下線功能只需要彈出一個對話框&#xff0c;讓用戶只能點擊確定按鈕&#xff0c;回到登錄界面。 如果在每一個活動中添加一個對話框的話太過繁瑣&#xff0c;用廣播…

Android入門(12)| 數據持久化

文章目錄數據持久化文件存儲將數據存儲進文件實例從文件中讀取數據實例SharedPreferences存儲將數據存儲進文件實例從文件中讀取數據實例實現記住密碼的功能SQLite數據庫存儲創建自己的幫助類調用自己的幫助類補全 onUpgrade() 方法增刪查改增&#xff1a;SQLiteDatabase.inser…

Android入門(13)| Android權限 與 內容提供器

文章目錄普通權限與危險權限運行時申請權限內容提供器運用安卓封裝好的內容提供器自實現的內容提供器概念實現普通權限與危險權限 主要用于不同應用程序之間在保證被訪數據的安全性的基礎上&#xff0c;實現數據共享的功能。 在 Android 6.0 開始引入了運行時權限的功能&…

Java實現身份證號碼的驗證,JAVA后臺驗證身份證號碼

代碼如下&#xff1a; package cn.gov.csrc.util;/*** 18 位身份證驗證器* * author admin* */ public class IDCard {final int[] wi { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };final int[] vi { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };private int[] ai n…

Android入門(14)| 通知

文章目錄創建通知點擊效果其它小功能實例創建通知 創建通知的步驟&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通過當前 Context 的 getSystemService() 獲取實例。它接受一個字符串參數用于確定獲取系統的什么服務。Android 8.0(O) 版本后需要通知通道&…

Android開發(3) | 權限和內容提供器的應用——調用相機和相冊

文章目錄拍照并保存到 ImageView 控件布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作隱式 Intent 啟動后的回調AndroidManifest.xml從相冊選取照片并在 ImageView 控件中顯示布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作自定義打開相冊的方法 op…

Android開發(4) | 系統權限、MediaPlayer類 和 VideoView類 的應用——播放多媒體文件

文章目錄MediaPlayer類播放音頻的實例VideoView類播放視頻的實例MediaPlayer類 對多種格式的音頻文件提供了全面的控制方法&#xff1a; 如何獲得MediaPlayer實例&#xff1f; 通過構造函數&#xff1a; MediaPlayer mp new MediaPlayer();調用 MediaPlayer.create() 方法&…

Android入門(15)| 網絡

文章目錄WebViewHTTP使用HttpURLConnection使用OkHttp封裝網絡操作封裝HttpURLConnection封裝OkHttpWebView WebView 可以在 應用程序中&#xff08;而不是瀏覽器&#xff09; 展示一些網頁。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Java-單例模式

單例模式相信大家都不陌生&#xff0c;在JAVAEE應用中&#xff0c;單例模式是一種應用非常廣泛的設計模式&#xff0c;應用中許多組件都只需要單個實例&#xff0c;下面介紹單例模式。 使用單例模式的優點&#xff1a; 1.減少創建JAVA實例所帶來的系統開銷。 2.便于系統跟蹤單…

Android入門(16)| 服務

文章目錄概念Android 多線程繼承 Thread繼承 Runable 接口匿名類異步消息處理AsyncTask使用服務框架啟動/停止服務綁定/解綁服務服務的生命周期前臺服務IntentService完整版下載示例下載過程的回調接口&#xff1a;DownloadListener繼承 AsyncTask 實現下載功能&#xff1a;Dow…

2020德勤面試開始了嗎_2020國考面試開始,近期面試公告匯總,附結構化小組面試流程...

2020年國家公務員考試面試環節逐步恢復考試&#xff0c;各個招錄部門已經發布面試考察公告&#xff0c;對于進入面試環節的國考考生來說&#xff0c;有必要了解近期國考面試的招錄動態&#xff0c;提前做好面試準備。2020國考國家統計局機關面試面試確認&#xff1a;請進入面試…