Android Activity總結

來源:互聯網
上載者:User
文章目錄
  • Activity是什麼
  • Activity的繼承關係
  • Android 中 Context
內容概要

• Activity的繼承關係

• Android 中 Context介紹
• Acitivy實際是如何執行個體化的
• Activity生命週期
• Activity的啟動方式,Task&Back Stack,進 程和線程,Intent.FLAG_ACTIVITY*

• Activity,Window,View的關係 

• Android訊息

內容

Activity是什麼

• 是個應用程式的組件,提供⼀一個可以讓使用者 互動的螢幕。它本身並不是介面。
Activity的繼承關係

• java.lang.Object
• ↳ android.content.Context
• ↳ android.content.ContextWrapper

↳ android.view.ContextThemeWrapper
• ↳ android.app.Activity

Android 中 Context

 • 是Android應用程式環境的全域資訊的接
口。
• 中文翻譯是:上下文
• 可以理解為:控制代碼,環境變數。
Context是什麼,它的作用?
• Context字面意思上下文,位於framework package的android.content.Context中,其實 該類為LONG型,類似Win32中的Handle句 柄,很多方法需要通過Context才能識別調用 者的執行個體,比如說T oast的第⼀一個參數就 是Context,⼀一般在Activity中我們直接 用this代替,代表調用者的執行個體為Activity,而 到了⼀一個button的onClick(View view)等方法 時,我們用this時就會報錯,所以我們可能使 用ActivityName.this來解決,主要原因是因為
實現Context的類主要有Android特有的幾個模
型,Activity、Service以及BroadcastReceiver

Activity生命週期
• 1、Activity 從建立到進入運行態所觸發的事
件 onCreate()-->onStart-->onResume() • 2、從運行態到停止態所觸發的事件
onPause()--->onStop()
• 3、從停止態到運行態所觸發事件 onRestart()-->onStart()--->onResume()
• 4、從運行態到暫停態所觸發事件 onPause()
• 5、從暫停態到運行態所觸發事件 onResume()
Activity生命週期
• a.開啟應
用:onCreate-》onStart-》 onResume ,在開始的時候這三個方法都會調用。
• b.從第⼀一個activity切換到第二個:先
會 onPause第⼀一個,然 後onCreate-》onStart-》 onResume,最 後在onStop
• c.從第二個切換到第⼀一個:內容與上⼀一步 相同
• d.按手機的回退(back)鍵:先onPause 第⼀一個,然
後 onRestart-》 onStart-》 onResume

Activity的啟動方式

• Activity有四種載入模式:

 • Standard
• singleTop
• singleTask
• singleInstance
Activity的啟動方式 • Standard啟動⼀一次就⼀一個執行個體
• singleTop 啟動時,如果正好在頂部 則NewIntent到這個執行個體,如果不在,則是 第二個執行個體
• singleTask 當Task裡存在執行個體, 則NewIntent到這個執行個體,
• singleInstance建立⼀一個單獨的task存放這 個執行個體,每次跳過來都是這個執行個體。
• onNewIntent onStart onResume
FLAG_ACTIVITY_REORDER_TO
• 如果已經啟動了四 個Activity:A,B,C和D,
在D Activity裡,想再啟動⼀一個Actvity B, 但不變成A,B,C,D,B,而是希望 是A,C,D,B,則可以像下面寫代 碼:intent.addFlags(Intent.FLAG_ACTIVI TY_REORDER_TO_FRONT);

FLAG_ACTIVITY_NEW_TASK
• 例如現在棧1的情況是:A B C。C通 過intent跳轉到D,並且這個intent添加 了FLAG_ACTIVITY_NEW_TASK標記,如 果D這個Activity在Manifest.xml中的聲明中 添加了Task affinity,並且和棧1的affinity不 同,系統首先會尋找有沒有
和D的T askaffinity相同的task棧存在,如果 有存在,將D壓入那個棧,如果不存在則會 建立⼀一個D的affinity的棧將其壓入。如 果D的Task affinity預設沒有設定,或者和 棧1的affinity相同,則會把其壓入棧1,變
成:A B C D,這樣就和不
FLAG_ACTIVITY_NO_HISTORY FLAG_ACTIVITY_SINGLE_TOP
• 例如現在棧情況為:A B C。C通過intent跳 轉到D,這個intent添 加FLAG_ACTIVITY_NO_HISTORY標誌, 則此時介面顯示D的內容,但是它並不會壓 入棧中。如果按返回鍵,返回到C,棧的情 況還是:A B C。如果此時D中又跳轉到E, 棧的情況變為:A B C E,此時按返回鍵會 回到C,因為D根本就沒有被壓入棧中。
• FLAG_ACTIVITY_SINGLE_TOP:和上 面Activity的Launch mode的singleTop類 似。如果某個intent添加了這個標誌,並且
這個intent的目標activity就是棧頂
FLAG_ACTIVITY_SINGLE_TOP
• 如果已經啟動了四個Activity:A,B, C和D。在D 裡,要到B ,同時去掉 C D 。用:Intent.FLAG_ACTIVITY_CLEAR_T OP
• 如果不想重新再建立⼀一個新的B,則加 上:Intent.FLAG_ACTIVITY_SINGLE
• intent.setFlags(Intent.FLAG_ACTIVITY_SI NGLE_TOP |Intent.FLAG_ACTIVITY_CLEAR_TOP);

• 這個和singleTask方式差不多

Android的5個進程等級

• 1) Foreground Process
• 正處於Activity Resume() 狀態
• 正處於與bound服務互動的狀態
• 正處於服務在前台啟動並執行狀態 , (startForeground() 被調用)
• Service生命週期函數正在被執行 ( onCreate() , onStart() , onDestroy())
• BroadcastReceiver 正在執 行onReceive()方法
殺死Foreground Process 需要使用者響應

程式啟動

PackManager和ActivityManager 

 一、PackageManager相關
PackageManager相關
本類API是對所有基於載入資訊的資料結 構的封裝,包括以下功能:

安裝,卸載應用 查詢permission相關資訊 查詢Application相關信
息(application,activity,receiver,service ,provider及相應屬性等)
查詢已安裝應用 增加,刪除permission 清除使用者資料、緩衝,程式碼片段等

Launcher

• 系統啟動後載入的第⼀一個程式 • 是其他應用程式的入口
• HomeScreen

Activity,Window,View的關係

• Activity在onCreate之前調用attach方法, 在attach方法中會建立window對 象。window對象建立時並木有創 建Decor對象對象。使用者在Activity中調 用setContentView,然後調 用window的setContentView,這時會檢 查DecorView是否存在,如果不存在則創 建DecorView對象,然後把使用者自己 的View 添加到DecorView中。

Android訊息

• 關於訊息機制的幾個類 • Handler
• Message
• MessageQueue
• Looper
Android訊息
• 1.Looper:(相當於隧道) ⼀一個線程可以產生 ⼀一個Looper 對象,由它來管理此線程裡 的Message Queue( 車隊,訊息隧道) 。
• 2.Handler: 你可以構造Handler 對象來 與Looper 溝通,以便push 新訊息 到Message Queue 裡;或者接 收Looper( 從Message Queue 取出) 所送 來的訊息。
• 3. Message Queue( 訊息佇列): 用來存放線 程放入的訊息。
• 4 .線程:UI thread 通常就是main
thread ,而Android 啟動程式時會替它建立
Activity實際是如何執行個體化的 

 activity  and  binder

• 從宏觀的角度觀
察Binder,Service,Service Manager,並闡 述各自的概念。從Linux的概念空間 中,Android的設計Activity託管在不同的的 進程,Service也都是託管在不同的進程, 不同進程間的Activity,Service之間要交換數 據屬於IPC。Binder就是為了Activity通訊而 設計的⼀一個輕量級的IPC架構。
• activity 整個應用程式的啟動過程: • ⼀一. Step1 - Step 11:Launcher通
過Binder處理序間通訊機制通
Activity調用棧

• 0:dalvik.system.VMStack.getThreadStack Trace(Native 1:java.lang.Thread.getStackTrace(Thread .java:737)
• 2:app.android.demo.activity.MainTestActiv ity$1.run(MainTestActivity.java:40) 3:android.os.Handler.handleCallback(Han dler.java:587)
• 4:android.os.Handler.dispatchMessage(H andler.java:92)
• 5:android.os.Looper.loop(Looper.java:123
)
• • • • •
• •
Activity調用棧
 
• 每個應用程式都以ActivityThread.main()為 入口進入到訊息迴圈處理。對於⼀一個進程 來講,我們需要這個閉合的處理架構。

Activity與HistoryRecord的關係

• 在整個系統中,Activity實際上有兩個實 體。⼀一個在應用進程中跟應用程式員打交 道的Activity,⼀一個是在AMS的中具有管理 功能的History Record。應用進程中 的Activity都登記ActivityThread執行個體中 的mActivity數組中,而 在AM端,HistroytRecord執行個體放置 在mHistroy棧中。mHistory棧是Android管 理Activity的場所,放置在棧頂的就 是User看到的處於活動狀態的Activity。
• Activity與HistrotyRecord的關係圖可以表示
如下:


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.