深入分析 Android Activity (一)

深入分析 Android Activity (一)

接下來我們會深入分析 Activity 的一些高級特性和內部實現,包括窗口管理、生命周期管理、以及與 Fragment 的交互。

1. Activity 的窗口管理

在 Android 中,每個 Activity 都與一個 Window 相關聯。Window 是一個抽象的頂級視圖,提供了繪制和事件處理的基本框架。通常情況下,Activity 使用 PhoneWindow 類,它是 Window 的一個具體實現。

當你調用 setContentView 方法時,實際上是通過 Window 設置 Activity 的布局:

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
}

PhoneWindow 的實現如下:

public class PhoneWindow extends Window {@Overridepublic void setContentView(int layoutResID) {// Inflate the layout and add it to the windowmLayoutInflater.inflate(layoutResID, mContentParent);}
}
2. Activity 的生命周期管理

Activity 的生命周期由 Android 系統管理。系統在適當的時候調用 Activity 的生命周期方法,以確保 Activity 能夠正確響應用戶和系統事件。以下是一些關鍵的生命周期事件的詳細說明:

onCreate

onCreateActivity 被創建時的第一個回調方法。通常在這里進行視圖的初始化和數據的加載:

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Initialize views and data
}
onStart

onStart 方法在 Activity 即將可見時調用。可以在這里執行一些準備操作,比如啟動動畫等:

@Override
protected void onStart() {super.onStart();// Prepare the activity to be visible
}
onResume

onResume 方法在 Activity 即將與用戶交互時調用。這里是讓 Activity 真正進入前臺,并開始交互的地方:

@Override
protected void onResume() {super.onResume();// Resume operations that were paused
}
onPause

onPause 方法在系統即將啟動另一個 Activity 時調用。在這里可以保存數據和狀態,釋放資源等:

@Override
protected void onPause() {super.onPause();// Save state and release resources
}
onStop

onStop 方法在 Activity 不再可見時調用。這里可以進一步釋放資源:

@Override
protected void onStop() {super.onStop();// Release more resources
}
onDestroy

onDestroy 方法在 Activity 被銷毀前調用。通常用于最后的清理工作:

@Override
protected void onDestroy() {super.onDestroy();// Clean up resources
}
onRestart

onRestart 方法在 Activity 從停止狀態重新啟動前調用。通常用于恢復暫停的操作:

@Override
protected void onRestart() {super.onRestart();// Restore state if needed
}
3. ActivityFragment 的交互

FragmentActivity 中的可復用組件,具有自己的布局和生命周期。一個 Activity 可以包含多個 Fragment,每個 Fragment 都可以獨立處理用戶交互。

添加 Fragment

可以在 Activity 中動態添加 Fragment

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MyFragment fragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
Fragment 的生命周期

Fragment 的生命周期與 Activity 類似,但有一些額外的方法來處理與 Activity 的交互:

  • onAttach(Activity activity): 當 Fragment 被附加到 Activity 時調用。
  • onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState): 創建并返回 Fragment 的視圖層次結構。
  • onActivityCreated(Bundle savedInstanceState): 當 ActivityonCreate 方法已經返回時調用。
  • onDestroyView(): 當 Fragment 的視圖層次結構被移除時調用。
4. Activity 的任務和返回棧

Android 使用任務和返回棧(Back Stack)來管理 Activity 的導航。每個任務由一個棧(返回棧)來管理 ActivityActivity 被啟動時,會被添加到任務的返回棧中。用戶按下返回按鈕時,系統會從返回棧中彈出當前的 Activity 并顯示前一個 Activity

可以通過 IntentFLAG_ACTIVITY_* 標志來控制任務和返回棧的行為。例如:

Intent intent = new Intent(this, AnotherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
5. 配置變化處理

當設備配置發生變化(如屏幕旋轉、語言更改等),Activity 會被銷毀并重新創建。可以通過 android:configChanges 屬性來處理某些配置變化,避免 Activity 的銷毀和重建:

<activity android:name=".MainActivity"android:configChanges="orientation|screenSize">
</activity>

Activity 中覆蓋 onConfigurationChanged 方法來處理配置變化:

@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);// Handle configuration changes
}

總結

Android 的 Activity 設計復雜且強大,提供了管理應用界面和用戶交互的豐富功能。通過理解其生命周期、窗口管理、與 Fragment 的交互、任務和返回棧的管理,以及配置變化處理,開發者可以創建高效、響應迅速且用戶友好的應用程序。掌握這些知識對于構建穩定和可維護的 Android 應用至關重要。

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

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

相關文章

如何選購尼龍輸送帶

尼龍輸送帶選購攻略&#xff1a;從入門到精通&#xff0c;一篇文章全搞定&#xff01; 在工業生產中&#xff0c;尼龍輸送帶作為關鍵的物流傳輸設備&#xff0c;其選擇和使用直接關系到生產效率和成本控制。面對市面上琳瑯滿目的尼龍輸送帶產品&#xff0c;如何選購到性價比高…

PointCloudLib 點云投影到XOY平面功能實現 C++版本

0.實現效果 左圖為原始點云,右圖為投影到XOY平面上的點云 將三維的點云投影到二維平面,方便處理一些二維輪廓方面的計算。 可以投影到空間中任意平面上。 1.算法原理 原理 點云投影是將三維空間中的點云數據映射到一個二維平面上的過程。這通常通過以下步驟實現: 確定投…

使用Golang開發一個HTTP客戶端請求命令行工具

什么是Golang Golang&#xff0c;也被稱為Go語言&#xff0c;是由Google開發的一種開源的編程語言。它于2007年開始設計&#xff0c;于2009年首次公開發布。Golang被設計成一種通用的編程語言&#xff0c;旨在提供簡單、高效和可靠的軟件開發方式。Golang具有靜態類型、垃圾回…

微服務實踐k8sdapr開發部署調用

前置條件 安裝docker與dapr: 手把手教你學Dapr - 3. 使用Dapr運行第一個.Net程序安裝k8s dapr 自托管模式運行 新建一個webapi無權限項目 launchSettings.json中applicationUrl端口改成5001,如下: "applicationUrl": "http://localhost:5001" //Wea…

c#實現視頻播放

在winform上實現視頻播放常用的控件時media player&#xff0c;vs工具欄初始狀態下沒有&#xff0c;需要我們到com組件中添加。添加完成后&#xff0c;把media player控件拖拽到一個Form窗口中。 在此實現遍歷某個文件夾下是否有mp4視頻&#xff0c;如果有則播放視頻。&#x…

BeautifulSoup4通過lxml使用Xpath,以及獲取(定位)元素和其文本或者屬性

環境&#xff1a;win10&#xff0c;python3.8.10 首先需要安裝&#xff1a;beautifulsoup4&#xff0c;lxml 使用命令&#xff1a; pip38 install beautifulsoup4 pip38 install lxml 安裝完畢后查看一下&#xff1a; 寫代碼&#xff1a; from bs4 import BeautifulSoup …

Go 圖像處理

Golang中的image包提供了基本的圖像類型、顏色模型、以及用于處理圖像的各種函數和接口。 常用類型與接口 image.Image 接口 這是Go語言中處理圖像的核心接口&#xff0c;定義了所有圖像必須實現的方法&#xff1a; type Image interface {// Bounds returns the domain for…

rocketmq 學習二 基本概念

教程&#xff1a;基本概念 | RocketMQ 視頻教程 https://www.bilibili.com/video/BV1d5411y7UW?vd_sourcef1bd3b5218c30adf0a002c8c937e0a27 版本&#xff1a;5.0 一 基本概念 1.1 生產者/Producer 1.1.1 定義 消息發布者。是構建并傳輸消息到服務端的運行實體。…

異眾比率(variation ratio)

異眾比率&#xff08;variation ratio&#xff09;是指非眾數組的頻數占總頻數的比率&#xff0c;其計算公式為: 其中&#xff0c;為眾數組的頻數。 異眾比率主要用于衡量眾數對一組數據的代表程度。異眾比率越大&#xff0c;說明非眾數組的頻數占總頻數的比重越大&#xff0…

harbor 認證

Harbor 認證過程 Harbor以 Docker Registry v2認證為基礎&#xff0c;添加上一層權限保護。1.v2 集成了一個安全認證的功能&#xff0c;將安全認證暴露給外部服務&#xff0c;讓外部服務去實現2.強制用戶每次Docker pull/push請求都要帶一個合法的Token&#xff0c;Registry會…

python的requests爬蟲模塊使用代理ip方法---集合

形式一 import requests proxies {http:128.3.74.224:2890,https:128.3.74.224:2890} ip requests.get(http://httpbin.org/ip,proxiesproxies) print(ip.text)形式二 形式一不行的情況下&#xff0c;試試形式二 import requests proxies {http:http://127.0.0.1:7890,http…

【AHK V2】設計模式之命令模式

目錄 情景劇場什么是命令模式優缺點優點缺點 使用命令模式的步驟命令模式代碼示例合理使用AI工具自動生成代碼 情景劇場 我們來設想一個場景&#xff1a; 你進入一家餐館&#xff0c;餐館只有老板一個人&#xff08;老板即廚師&#xff09;。 “老板&#xff0c;一份小炒肉&am…

Vue插槽solt如何傳遞具名插槽的數據給子組件?

在Vue中&#xff0c;你可以通過作用域插槽&#xff08;scoped slots&#xff09;來傳遞數據給子組件。這同樣適用于具名插槽。首先&#xff0c;你需要在子組件中定義一個具名插槽&#xff0c;并通過v-slot指令傳遞數據。例如&#xff1a; 子組件&#xff08;ChildComponent.vu…

自用RedisConfig的配置,更改key為string和value json的序列化,避免set亂的key

自用RedisConfig的配置&#xff0c;更改key為string和value json的序列化&#xff0c;避免set亂的key&#xff0c;使用StringRedisTemplate也可以解決&#xff0c;保證了redis set的值是正確的 Configuration public class RedisConfig {//更改key為string和value json的序列化…

吃透1850道真題和解析備考AMC8和AMC(1020240524持續發布)

多做真題&#xff0c;吃透真題和背后的知識點是備考AMC8、AMC10有效的方法之一&#xff0c;通過做真題&#xff0c;可以幫助孩子找到真實競賽的感覺&#xff0c;而且更加貼近比賽的內容&#xff0c;可以通過真題查漏補缺&#xff0c;更有針對性的補齊知識的短板。 今天我們繼續…

在新cloud上啟動備份數據庫

情況介紹&#xff1a;在云上劃拉一塊地方建立本地數據庫測試環境&#xff0c;通過數據庫備份包恢復數據并啟動。 1.在云上或者你自己的server上安裝Percona Server for MySQL&#xff0c;步驟如下 Use APT repositories - Percona Server for MySQL How to Install or Upgra…

java實現List對象轉geojson文本返回前端

1.業務需求 查詢帶有經緯度數據的list列表&#xff0c;將其轉為geojson格式給前端。 2.GeoJson格式說明 GeoJSON是一種對各種地理數據結構進行編碼的格式&#xff0c;基于Javascript對象表示法(JavaScript Object Notation, 簡稱JSON)的地理空間信息數據交換格式。GeoJSON對…

計算機系統的層次結構

操作系統的定義 操作系統&#xff08;Operating System&#xff0c; OS&#xff09;是指控制和管理整個計算機系統的硬件和軟件資源&#xff0c;并合理地組織調度計算機的工作和資源的分配&#xff1b;以提供給用戶和其他軟件方便的接口和環境&#xff1b;它是計算機系統中最基…

GBase 8s 如何查看回滾的事務 和對應的SQL

描述&#xff1a; 如何查看當前數據庫中是否有事務在回滾&#xff0c; 如果有&#xff0c; 具體是哪條 SQL 在回滾&#xff1f; 解決辦法&#xff1a; 方法1&#xff1a; 通過 onstat -u|grep RP&#xff1b; 可以獲取相關的 sessionid。 通過 onstat -g ses sid 獲取 SQL&a…

【多模態融合】Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

論文鏈接&#xff1a;Cross Modal Transformer: Towards Fast and Robust 3D Object Detection 代碼鏈接&#xff1a;https://github.com/junjie18/CMT 作者&#xff1a;Junjie Yan, Yingfei Liu, Jianjian Sun, Fan Jia, Shuailin Li, Tiancai Wang, Xiangyu Zhang 發表單位…