深入分析 Android Activity (二)

文章目錄

      • 深入分析 Android Activity (二)
      • 1. `Activity` 的啟動模式(Launch Modes)
        • 1.1 標準模式(standard)
        • 1.2 單頂模式(singleTop)
        • 1.3 單任務模式(singleTask)
        • 1.4 單實例模式(singleInstance)
      • 2. 深入理解 Intent 和 Intent Filters
        • 2.1 Intent
        • 2.2 Intent Filter
      • 3. Activity 的進程和線程模型
        • 3.1 進程
        • 3.2 線程
      • 4. Activity 與 Service 的交互
        • 4.1 啟動服務
        • 4.2 綁定服務
      • 總結

深入分析 Android Activity (二)

1. Activity 的啟動模式(Launch Modes)

Android 提供了幾種不同的啟動模式,用于定義 Activity 的啟動行為。這些模式通過 AndroidManifest.xml 文件中的 android:launchMode 屬性或 Intent 標志進行配置。

1.1 標準模式(standard)

這是默認的啟動模式。每次啟動 Activity 都會創建一個新的實例,無論該 Activity 是否已經存在于棧中。

<activity android:name=".MyActivity"android:launchMode="standard">
</activity>
1.2 單頂模式(singleTop)

如果當前任務的棧頂已經有該 Activity 實例,則重用該實例,并調用其 onNewIntent 方法,否則創建新的實例。

<activity android:name=".MyActivity"android:launchMode="singleTop">
</activity>

使用 Intent 標志也可以實現相同效果:

Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
1.3 單任務模式(singleTask)

在棧中只保留一個 Activity 實例。如果實例存在,則將其置于棧頂,并調用其 onNewIntent 方法,否則創建新的實例。

<activity android:name=".MyActivity"android:launchMode="singleTask">
</activity>
1.4 單實例模式(singleInstance)

創建一個單獨的任務棧來管理該 Activity,并且在該任務棧中只存在這一個 Activity 實例。

<activity android:name=".MyActivity"android:launchMode="singleInstance">
</activity>

2. 深入理解 Intent 和 Intent Filters

2.1 Intent

Intent 是 Android 中用于在不同組件(如 ActivityServiceBroadcastReceiver)之間傳遞數據和請求操作的消息對象。主要分為兩種類型:

  • 顯式 Intent:明確指定目標組件的 Intent
  • 隱式 Intent:不指定目標組件,通過 Intent Filter 進行匹配。

顯式 Intent 示例:

Intent intent = new Intent(this, MyActivity.class);
startActivity(intent);

隱式 Intent 示例:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
startActivity(intent);
2.2 Intent Filter

Intent Filter 用于在 AndroidManifest.xml 中聲明 ActivityServiceBroadcastReceiver 能夠響應的 Intent 類型。

<activity android:name=".MyActivity"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="http" android:host="www.example.com"/></intent-filter>
</activity>

3. Activity 的進程和線程模型

3.1 進程

默認情況下,每個應用程序在獨立的 Linux 進程中運行。應用程序中的所有組件(ActivityServiceBroadcastReceiverContentProvider)都在同一個進程中運行。

可以在 AndroidManifest.xml 中通過 android:process 屬性為某些組件指定不同的進程:

<activity android:name=".MyActivity"android:process=":remote"/>
3.2 線程

Android 的主線程(也稱為 UI 線程)用于處理 UI 更新和用戶交互。因此,不能在主線程中執行耗時的操作,以避免阻塞 UI 響應。可以使用 AsyncTaskHandlerThreadExecutor 框架在后臺線程中執行耗時操作。

使用 AsyncTask 進行后臺操作:

private class DownloadTask extends AsyncTask<URL, Integer, Long> {protected Long doInBackground(URL... urls) {// Perform background task}protected void onProgressUpdate(Integer... progress) {// Update UI progress}protected void onPostExecute(Long result) {// Update UI with result}
}

4. Activity 與 Service 的交互

Service 是在后臺運行的組件,用于執行長時間運行的操作。Activity 可以通過 startServicebindServiceService 交互。

4.1 啟動服務

startService 用于啟動服務:

Intent intent = new Intent(this, MyService.class);
startService(intent);
4.2 綁定服務

bindService 用于綁定服務,并獲取 IBinder 以進行通信:

Intent intent = new Intent(this, MyService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

ServiceConnection 用于管理 Service 的連接和斷開:

private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MyService.LocalBinder binder = (MyService.LocalBinder) service;myService = binder.getService();isBound = true;}@Overridepublic void onServiceDisconnected(ComponentName name) {isBound = false;}
};

總結

Android Activity 的設計涉及多個方面,包括生命周期管理、啟動模式、視圖管理、進程和線程模型、以及與其他組件(如 FragmentService)的交互。理解 Activity 的設計原理和內部實現,有助于開發者構建高效、穩定和響應迅速的應用程序。通過深入分析和理解這些關鍵概念,開發者可以在實際項目中靈活應用這些知識,提升應用程序的用戶體驗和性能。

歡迎點贊|關注|收藏|評論,您的肯定是我創作的動力

在這里插入圖片描述

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

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

相關文章

利用邊緣計算網關的工業設備數據采集方案探討-天拓四方

隨著工業4.0時代的到來&#xff0c;工業設備數據采集成為了實現智能制造、提升生產效率的關鍵環節。傳統的數據采集方案往往依賴于中心化的數據處理方式&#xff0c;但這種方式在面對海量數據、實時性要求高的工業場景時&#xff0c;往往顯得力不從心。因此&#xff0c;利用邊緣…

CSS實現一個雨滴滑落效果

使用純CSS來實現一個真實的雨滴滑落效果可能會有些挑戰&#xff0c;因為CSS主要關注于靜態樣式和簡單的動畫效果。然而&#xff0c;你可以使用CSS動畫和keyframes來模擬一個雨滴滑落的簡化效果。 以下是一個基本的示例&#xff0c;展示如何使用CSS來模擬雨滴從頂部滑落到底部的…

AI學習指南數學工具篇-MATLAB中的凸優化工具

AI學習指南數學工具篇-MATLAB中的凸優化工具 在人工智能領域&#xff0c;凸優化是一個非常重要的數學工具&#xff0c;它在機器學習、深度學習、數據分析等領域都有著廣泛的應用。而MATLAB作為一款強大的數學工具軟件&#xff0c;提供了豐富的凸優化工具和函數&#xff0c;為用…

二叉樹的鏈式結構(二叉樹)與順序結構(堆)---數據結構

一、樹的概念與結構 1、樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。我們常把它叫做樹&#xff0c;是因為它看起來像一棵倒掛的樹&#xff0c;它的根是朝上的&#xff0c;而葉是朝下的。 下面…

給我一個用斷言結果執行下一步的例子

在使用 pytest 和 Selenium 進行自動化測試時&#xff0c;通常我們會根據斷言的結果來決定測試流程的走向。如果斷言失敗&#xff0c;測試通常會停止執行后續的步驟&#xff0c;因為失敗意味著被測系統沒有按照預期工作。然而&#xff0c;有時候我們可能需要在斷言失敗后執行特…

每日復盤-20240528

今日重點關注&#xff1a; 20240528 六日漲幅最大: ------1--------300956--------- 英力股份 五日漲幅最大: ------1--------301361--------- 眾智科技 四日漲幅最大: ------1--------301361--------- 眾智科技 三日漲幅最大: ------1--------301361--------- 眾智科技 二日漲…

前端編程語言——JS背景知識、JS基礎語法、算數運算符和關系運算符(1)

0、前言&#xff1a; JS全稱是JavaScript&#xff0c;是一種腳本語言&#xff0c;誕生于1995年&#xff0c;JS是由ECMAScript&#xff08;包含js語法&#xff09;、BOM&#xff08;Brower Oject Model&#xff0c;和瀏覽器相關操作&#xff09;、DOM&#xff08;Document Obje…

ubuntu設置中文輸入法教程

在 Ubuntu 上設置中文輸入法可以通過以下步驟來完成。我們將以安裝和配置 fcitx 輸入法框架及其中文輸入法插件 fcitx-sunpinyin 為例。 ### 步驟一&#xff1a;安裝 fcitx 和中文輸入法插件 1. **更新軟件包列表** 打開終端并運行以下命令來更新軟件包列表&#xff1a; …

淺談—“文件映射”

目錄 文件映射頭文件&#xff1a; 核心函數 port flags 文件映射頭文件&#xff1a; #include<sys/mman.h> 核心函數 void *mmap(void *addr,size_t length, int port,int flags,int fd, off_t offset ); int munmap(void *addr,size_t length);// 對比free&#x…

聯邦和反射器實驗

拓撲圖 一.實驗要求 1.AS1存在兩個環回&#xff0c;一個地址為192.168.1.0/24&#xff0c;該地址不能在任何協議中宣告 AS3存在兩個環回&#xff0c;一個地址為192.168.2.0/24&#xff0c;該地址不能在任何協議中宣告 AS1還有一個環回地址為10.1.1.0/24&#xff…

PyTorch訓練關鍵點

1.背景 在網上找了一些資料用來訓練關鍵點&#xff0c;一般都是人臉或者車牌關鍵點訓練&#xff0c;或者是聯合檢測一起訓練。很少有是單獨基于輕量級網絡訓練單獨關鍵點模型的工程&#xff0c;本文簡單介紹一種簡單方法和代碼。 2.代碼模塊 &#xff08;1&#xff09;網絡結…

[C][動態內存分配][柔性數組]詳細講解

目錄 1.動態內存函數的介紹1.malloc2.free2.calloc4.realloc 2.常見的動態內存錯誤3.C/C程序的內存開辟4.柔性數組1.是什么&#xff1f;2.柔性數組的特點3.柔性數組的使用4.柔性數組的優勢 1.動態內存函數的介紹 1.malloc 函數原型&#xff1a;void* malloc(size_t size)功能…

iOS馬甲包, AB面,H5跳轉包,開發上架

什么是馬甲包 馬甲包一般是主APP的分身或者克隆&#xff0c;也或者說是穿著馬甲的一個APP&#xff0c;脫掉馬甲&#xff0c;APP將呈現另一種樣式&#xff0c;也就是常說的AB面APP。 1. 馬甲包、AB面、白包、h5跳轉包 2.蘋果開發者 3.TG&#xff1a;APPYKJ 4.喂心&#xff1…

【AI算法崗面試八股面經【超全整理】——概率論】

AI算法崗面試八股面經【超全整理】 概率論信息論機器學習CVNLP 目錄 1、古典概型、幾何概型2、條件概率、全概率公式、貝葉斯公式3、先驗概率、后驗概率4、離散型隨機變量的常見分布5、連續型隨機變量的常見分別6、數學期望、方差7、協方差、相關系數8、獨立、互斥、不相關9.大…

【PB案例學習筆記】-11動畫顯示窗口

寫在前面 這是PB案例學習筆記系列文章的第11篇&#xff0c;該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習&#xff0c;提高編程技巧&#xff0c;以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼&#xff0c;小凡都上傳到了gite…

ESP32 - Micropython ESP-IDF 雙線教程 WIFI (2)

ESP32 - Micropython ESP-IDF 雙線教程 WIFI ESP32 - IDF WIFI轉換為ESP32-IDF的示例代碼main/main.c 代碼解釋 ESP32 - IDF WIFI 轉換為ESP32-IDF的示例代碼 以下是使用ESP-IDF&#xff08;Espressif IoT Development Framework&#xff09;編寫的連接到Wi-Fi網絡的示例代碼…

頸源性頭痛癥狀及表

頸源性頭痛一般表現為&#xff0c;就是說從枕后一直顳側&#xff0c;到太陽穴附近&#xff0c;這個是枕小的一個疼痛&#xff0c;還有一部分人從枕后&#xff0c;沿著一個弧線&#xff08;如下圖&#xff09;的軌跡到了前額&#xff0c;到我們前額&#xff0c;這樣一個疼痛&…

Bitbucket的原理及應用詳解(一)

本系列文章簡介&#xff1a; 在數字化和全球化的今天&#xff0c;軟件開發和項目管理已經成為企業成功的關鍵因素之一。隨著團隊規模的擴大和項目的復雜化&#xff0c;如何高效地協同開發、管理代碼和確保代碼質量成為了開發者和管理者面臨的重要挑戰。Bitbucket作為一款功能強…

深入解析線程上下文切換:掌握線程上下文切換的核心原理

1. 進程與線程的基本概念 1.1 進程與線程的區別 在操作系統中&#xff0c;進程和線程是兩個基本的概念&#xff0c;它們共同構成了程序的執行環境。了解它們的區別是理解線程上下文切換的基礎。 進程&#xff1a;進程是程序的一次執行實例。它是操作系統資源分配的基本單位。…

pytest的斷言與Selenium 模擬操作的一個例子

在Python中&#xff0c;pytest是一個流行的單元測試框架&#xff0c;而Selenium是一個用于自動化瀏覽器操作的工具。結合這兩者&#xff0c;我們可以編寫自動化測試腳本來驗證網頁的行為是否符合預期。下面是一個簡單的例子&#xff0c;展示了如何使用pytest的斷言功能以及Sele…