Android基本之Acticity&Intent

一、理解Activity

Activity是Android程序的4大組件之一。
Activity是Android程序的表示層,程序的每一個顯示屏幕就是一個Activity。

每一個Activity作爲一個獨立的類來實現,均繼承自Activity 基類。

Activity類將顯示一個由若干View 控件組成的用戶界面並對事件做出響應。

大多數Activity都是全屏的,但是也可以創建半透明或者浮動的Activity。

在清單文件AndroidManifest.xml中告訴程序,我定義了一個新的Activity,你可以去調用它。

Activity是Context類的子類, Activity類的繼承關係:

 

image

二、理解Activity的生命週期

如果資源不足的時候,或者在內存不足的時候,可能隨時要把現有程序關閉;因此Android程序和電腦上的程序有所不同,具體到Activity,Activity的生命週期不是自身控制的,而是由Android系統控制的。

 

在Android中Activity有四種基本狀態:
1、Running
位於屏幕最前端時,此時處於可見狀態,和用戶可交互的狀態。
2、Paused
當Acitivy被另一個透明的或者非全屏的Activity覆蓋時的狀態叫Paused狀態,雖然可見但不可交互。
3、Stop
當Activity被另外一個Activity覆蓋、界面不可見時處於Stop狀態。
4、Killed
Activity被系統殺死或者跟本沒啓動時就是Killed狀態。

 

下面看一下Activity的生命週期:

 

activity_lifecycle

 
Android通過Activity棧的方式來管理Activity,正在運行的Activity 處在在棧的最頂端,它是運行狀態的;


 

image

 

 

當有新Activity進入屏幕最上端時,原來的Activity就會被壓入第二層,如果他的屏幕沒有被完全遮蓋,那麼他處於Pause狀態,如果他被遮蓋那麼他處於Stop狀態。

 

當然不管你出於任何一層,都可能在系統覺得資源不足時被強行關閉,當然關閉時在棧底的程序最先被關閉。

 

譬如:當你在程序中調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵一樣:他告訴 Activity Manager該Activity實例可以被“回收”。隨後 Activity Manager 激活處於棧第二層的 Activity 並重新入棧,把原 Activity 壓入到棧的第二層,從 Running 狀態轉到 Paused 狀態。

 

屏幕翻轉時,Android系統會把Activity先殺死(具體順序是先暫停、後關閉再銷燬),然後再啓動(具體順序是先創建,後啓動再恢復), 可見是Android系統而不是程序員在控制Activity的生命週期。

 

屏幕翻轉時,不銷燬當前Activity的方法:首先在Mainifest.xml 的Activity 元素中加入android:configChanges="orientation|keyboardHidden"屬性,並在代碼中加入對onConfigurationChanged的處理;

有可能在被系統kill時,不運行onStop和onDestory這兩個方法的,要注意!應在onPause的時候保存好現場。

以下摘自官方文檔:

Because onPause() is the first of the three, once the activity is created, onPause() is the last method that's guaranteed to be called before the process can be killed—if the system must recover memory in an emergency, then onStop() and onDestroy() might not be called. Therefore, you should use onPause() to write crucial persistent data (such as user edits) to storage. However, you should be selective about what information must be retained during onPause(), because any blocking procedures in this method block the transition to the next activity and slow the user experience.

三、理解Intent

在一個Android應用中,Intent是對執行某個操作的一個抽象描述,Intent 負責提供組件之間相互調用的相關信息傳遞,實現調用者和被調用者之間的解耦。

 

 

Intent是對執行某個操作的一個抽象描述,其描述的內容包括,對執行動作Action的描述、對操作數據的描述、還有4種附加屬性的描述。分別介紹如下:

Action
,對執行動作的描述,是個字符串,是對所將執行的動作的描述,在Intent類中定義了一些字符串常量作爲標準動作,譬如:

public static final String ACTION_DIAL = "android.intent.action.DIAL"
public static final String ACTION_SENDTO = "android.intent.action.SENDTO";

我們還可以自定義Action,並定義相應的Activity來處理我們自定義的行爲。

 

data ,是對執行動作所要操作的數據的描述,Android中採用URI來表示數據,譬如在聯繫人應用中,指向聯繫人1的URI可能爲:content://contacts/1 (由content provider提供的數據類型是content) 。 結合Action和data可以基本表達出意圖,

  • VIEW_ACTION content://contacts/1 — 顯示標識符爲”1″的聯繫人的詳細信息
  • EDIT_ACTION content://contacts/1 — 編輯標識符爲”1″的聯繫人的詳細信息
  • VIEW_ACTION content://contacts/ — 顯示所有聯繫人的列表
  • PICK_ACTION content://contacts/ — 顯示所有聯繫人的列表,並且允許用戶在列表中選擇一個聯繫人,然後把這個聯繫人返回給父Activity。例如:電子郵件客戶端可以使用這個 Intent,要求用戶在聯繫人列表中選擇一個聯繫人。

除了Action和data之外,還有4個屬性。

 

catagory 類別,是被請求組件的額外描述信息,Intent類中也定義了一組字符串常量表示Intent不同的類別。完整的列表可以看API文檔中Intent類的相應部分。

 

public static final String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";

public static final String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";

 

我們還可以自定義Catagory,並通過它啓動那些使用了該Catagory的Activity;

 

extra 附加信息,除了data之外,還可以通過extra附加信息,extra屬性使用Bundle類型進行數據傳遞,我們可以把Bundle當做HashMap來理解,附加數據可以通過 intent.putExtras() 和 intent.getExtras() 進行傳入和讀取。

 

就像這樣,獲取附加信息: Bundle bundle = intent.getExtras();

添加附加信息: Bundle bundle = new Bundle(); intent.putExtras(bundle);

 

component 組件,顯式指定Intent的目標組件的名稱。如果指定了component屬性,系統會直接使用它指定的組件,而非匹配查找。

 

type 數據類型,顯式指定Intent的數據類型,一般Intent的數據類型都能夠根據數據本身進行判定,但是通過設置這個屬性,可以強制採用顯式指定的類型和不再進行推導。

 

Intent是一種在不同組件之間傳遞的請求信息,是應用程序發出的請求和意圖,作爲一個完整的消息傳遞機制,Intent不僅需要發送端,還需要接收端。

 

當指定了component屬性後,就是顯式的指定了目標組件,也就是接收端。

如果沒有明確指定目標組件,那麼Android系統會使用 Intent 裏的(action,data,category)三個屬性來尋找和匹配接收端。

 

應用程序組件可以使用IntentFilter來向系統說明自己可以響應和處理那些Intent請求。

組件一般通過AndroidManifest.xml文件的<Intent-Filter>描述。

<activity android:name=”.MainActivity” android:label=”@string/app_name”>

<intent-filter>

<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />

</intent-filter>

</activity>

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章