1. 程式人生 > >Android6.0之Activity的管理與啟動模式

Android6.0之Activity的管理與啟動模式

前面分析到了ActivityStackSupervisor類中的startActivityLocked方法,在分析這個方法前,先介紹一些關於Activity的知識,以方便我們理解程式碼.

Task

Task是一個棧,它的作用是以先進後退的方式組織Activity。

Android把使用者一次操作相關的Activity按照先後順序儲存在一個Task中,這樣當用戶按back鍵時,就能按照相反的順序退回去.

系統執行時記憶體中可能存在多個Task,當我們按Recent鍵(android手機中的選單鍵,或者多工鍵)時,會彈出一個列表讓你選擇,這個列表就是系統中存在的Task集合.選擇一個Task時,將把它所包含的所有Activity作為一個成體帶到前臺.Task中的Activity的順序通常是不能改變的,只能是入棧或出棧.

AMS中使用TaskRecord類來表示Task.

原始碼路徑:

1
Android-6/frameworks/base/services/core/java/com/android/server/am/TaskRecord.java

預設模式,可以不用寫配置。在這個模式下,都會預設建立一個新的例項。因此,在這種模式下,可以有多個相同的例項,也允許多個相同Activity疊加
類定義節選如下,可以參考程式碼註釋來理解.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 24 25 26 27 28 29 30 31
final class TaskRecord {
  ...........
  final int taskId;       // Unique identifier for this task.
  int mAffiliatedTaskId; // taskId of parent affiliation or self if no parent.
  // 可以理解為當前task的name
  String affinity;        // The affinity name for this task, or null; may change identity.
// 啟動這個task的intent Intent intent; // The original intent that started the task. long firstActiveTime; // First time this task was active. long lastActiveTime; // Last time this task was active, including sleep. boolean inRecents; // Actually in the recents list? boolean isAvailable; // Is the activity available to be launched? // task模式 int mLockTaskMode; // Which tasklock mode to launch this task in. One of // ActivityManager.LOCK_TASK_LAUNCH_MODE_* /** List of all activities in the task arranged in history order */ // 該Task中所有的Activity final ArrayList<ActivityRecord> mActivities; /** Current stack */ // 該Task所在的ActivityStack ActivityStack stack; // 最近列表中,可以看到當前Task的縮圖 private Bitmap mLastThumbnail; // Last thumbnail captured for this item. private final File mLastThumbnailFile; // File containing last thumbnail. final ActivityManagerService mService; .......... }

變數affinity是這個Task的名字,affinity在AMS中是唯一的,AMS查詢一個Task,優先比較它的affinity.

task是該Activity所在的Task,可以在AndroidManifest.xml中以下面的形式指出該activity的所在task的名字.

1
2
3
4
5
<activity android:name=".Activity1"

  android:taskAffinity="****task名字***"

</activity>

一個Task的affinity只有在其被建立的時候才有用.以後加入這個task的Activity,即使他們通過taskAffinity指定了了一個不同的字串,也不會改變task的名稱.

通常不會主動去設定一個Activity的taskAffinity屬性,如果不設定的話,繼承標籤中的taskAffinity屬性值.如果中也沒有指定taskAffinity,那麼預設使用包名.

正因為如此,應用中的所有Activity的taskAffinity屬性值預設狀態下是相同的,都是包名.所以在應用中使用FLAG_ACTIVITY_NEW_TASK標誌去啟動一個本應用中的一個activity,也不會建立一個新的task,除非這個activity額外指定了不同的taskAffinity屬性值.

ActivityRecord

一個Activity在AMS中是使用類ActivityRecord表示的.

原始碼路徑:

1
Android-6/frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java

節選定義如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
final class ActivityRecord {
  ..................
  final ActivityManagerService service; // owner
  final IApplicationToken.Stub appToken; // window manager token\
  //從AndroidManifest.xml中得到的該activity的基本資訊
  final ActivityInfo info; // all about me
  final ApplicationInfo appInfo; // information about activity's app
  final Intent intent;    // the original intent that generated us
  final String processName; // process where this component wants to run
  // 所在task名字
  final String taskAffinity; // as per ActivityInfo.taskAffinity
  int icon;               // resource identifier of activity's icon.
  int logo;               // resource identifier of activity's logo.
  int theme;              // resource identifier of activity's theme.
  // 這個activity所在的Task
  TaskRecord task;        // the task this is in.
  // 這個Activity執行所在的程序
  ProcessRecord app;      // if non-null, hosting application
  ActivityState state;    // current state we are in
  PersistableBundle persistentState; // last persistently saved activity state
  boolean frontOfTask;    // is this the root activity of its task?
  // Activity啟動模式
  int launchMode;         // the launch mode activity attribute.
  private boolean inHistory;  // are we in the history stack?
  final ActivityStackSupervisor mStackSupervisor;
  ..................
}

ActivityStack

AMS中使用ActivityStack類來管理Task.

原始碼路徑:

1
Android-6/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

節選定義如下:

1
2
3
4
5
6
7
8
9
10

            
           

相關推薦

Android6.0Activity管理啟動模式

前面分析到了ActivityStackSupervisor類中的startActivityLocked方法,在分析這個方法前,先介紹一些關於Activity的知識,以方便我們理解程式碼. Task Task是一個棧,它的作用是以先進後退的方式組織Act

Android基礎Activity四種啟動模式和task相關

1 啟動模式介紹 啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標籤的android:launchMode屬性設定; 啟動模式有4種,分別為standard、singleTop、singleTask、singleI

Activity生命週期啟動模式

目錄 一、生命週期 Activity的各種生命週期 onSaveInstanceState() 與 onRestoreInstanceState() Activity生命週期的變化 二、啟動模式

mongoDB建立使用者認證模式啟動

mongoDB建立使用者 不管是mongoDB還是MySQL,我們往往都需要建立使用者來保證安全性,在這裡對這方面內容做一個簡單的總結~ 建立使用者 建立使用者有幫助增加資料庫安全的作用,在mongoDB中需要下列步驟 建立管理員 授權認證

Android6.0AMS通過socketzygote通訊建立app程序

轉自:https://blog.csdn.net/love000520/article/details/70230784 前面分析到了ActivityStackSupervisor類中的startActivityUncheckedLocked方法,該方法主要是為要啟動的activity準備一個t

ubuntu18.0+win10 grub2修復啟動管理

一.boot-repair修復grub 第一步: 啟動ubuntu live 第二步: sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get upda

Android6.0 AMS 新程序中啟動Activity

看到同一個應用程式的Activity一般都是在同一個程序中啟動,事實上,Activity也可以像Service一樣在新的程序中啟動,這樣,一個應用程式就可以跨越好幾個程序了,本文就分析一下在新的程序中啟動Activity的方法和過程。         在Android系統中

Activity四種啟動模式任務棧(Task)總結分析

最近在總結android基礎問題 比如Activity的四種啟動模式  其中有涉及到任務棧的問題   之前都是一知半解   現在想著用筆記錄下來  可供自己以後參考 android任務棧簡單瞭解 1. android任務棧又稱為Task,它是一個棧結構,具有後進先出的特性

對設計模式的總結簡單工廠策略模式

mage 建立 不變 href catch nag 實現類 初步 cti 前言 面向對象編程追求的本質-提高擴展性、可維護性、靈活性和復用性。合理利用面向對象6個原則,能夠很好的達到要求。如何利用好就是至關重要的了,前人總結了23+個設計模式能夠讓初學者更容易

Android6.0權限管理以及使用權限該註意的地方

結果 res hone grant 設備 -m hid 頁面 start Android 6.0 Marshmallow首次增加了執行時權限管理,這對用戶來說,能夠更好的了解、控 制 app 涉及到的權限。然而對開發人員來說卻是一件比較蛋疼的事情。須要兼

centOS7服務管理啟動流程

當前 接下來 提示 設置 內存 ios 名稱 .gz 還要 centOS7服務管理與啟動流程 centOS7啟動流程 systemd簡介 unit對象 unit類型 特性 service unit文件格式 serv

Impala源碼資源管理資源隔離

查詢 圖片 src 阻塞隊列 AI 詳細 利用 生成 獨立 本文由 網易雲 發布。 前言 Impala是一個MPP架構的查詢系統,為了做到平臺化服務,首先需要考慮就是如何做到資源隔離,多個產品之間盡可能小的甚至毫無影響。對於這種需求,最好的隔離方案無疑是物理機器上

管理發展模式才是聯想的癥結

國內 PC 行動 5G 規模 摩托羅拉 其他 下滑 進一步 最近,聯想在3GPP上有關5G的投票的事件被炒得沸沸揚揚,一時間網民群情激昂,眾說紛紜。作為一個聯想的消費者與國內PC市場風雲變換的見證者,我不妨也說說我的觀點。 先撇開投票這件事,我們回顧一下聯想的發家史。

【筆記】Activity四種啟動模式區別

參考:https://blog.csdn.net/edisonchang/article/details/49981457 activity 啟動的四種模式 : AndroidManifest.xml :: android:launchMode="???" 1.standard:【不會

Spring Boot2.0 監控管理

Spring boot監控中心:  針對微服務的服務狀態,伺服器的記憶體變化(記憶體、執行緒、日誌管理等)檢測服務配置連線地址是否有用(有些懶載入的情況下,用的時候發現臥槽不能用)模擬訪問,懶載入。統計有多少個bean(Spring 容器中的bean)、統計Spring MVC 中@Request

mysql學習資料庫管理管理

資料庫管理 3.1 查詢所有資料庫 mysql> show databases; 3.2 建立資料庫 mysql> create database emp       -- 指定預設字符集建立資料庫   &n

MySQL基礎資料管理常用函式

一.MySQL資料操作 1.新增記錄 INSERT [INTO] tbl_name [(col_name,...)] {VALUE|VALUES}(VALUES...); 不指定欄位名稱

Activity四種啟動模式的認識

最近看了一些前輩的文章,有了一些新的認識,不僅僅是知識,包括對待事情的態度。記錄下來,作為自己態度的見證。首先在android中對於Activity的例項是通過棧(Task)來進行管理的,棧是一種先進後出的資料結構。主要的操作就是進棧和出棧。簡單的如下圖所示。

ARMV8架構memory管理模型(一)

一個典型系統的memory map會被分隔成不同的邏輯區域,每個區域都要求有不同的memory屬性,比如說: Access Permission屬性定義的在User/Privileged模式下的讀寫許可權. Caching屬性定義了該memory空間是否會有副本存在於cac

[Android]Activity生命週期+啟動模式

Activity是一個與使用者互動的介面。 一、Activity生命週期  1.Activity的4種狀態      Active  Paused  Stopped  killed Active:當前