自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android開發(fā)入門:四大組件之Activities

移動開發(fā) Android
本文介紹了作為Android開發(fā)四大組件之一的Activity,從定義到如何創(chuàng)建,到生命周期的管理,是學習Android開發(fā)入門的好資料。

1、定義

Activity是為用戶提供可視化界面并可以與用戶交互的組件。

2、概述

應用程序通常是多個松散并相互綁定的Activity組成。一般,用戶***啟動應用時,將啟動一個被指定為main的Activity。每個Activity都可以啟動另一個Activity,以執(zhí)行不同的動作。每次啟動一個新的Activity,以前的Activity停止,但在系統(tǒng)堆棧保留Activity(“回棧”)。一個新的Activity啟動時,它將當前Activity壓到棧里面并取得用戶的焦點。回堆棧遵守基本的“后進先出”的堆棧機制。當用戶在當前Activity,按下返回按鈕,則當前彈出堆棧(并銷毀)和恢復以前的Activity。

Activity停止是因為一個新的Activity開始,通過活動的生命周期回調方法,通知這種狀態(tài)發(fā)送變化。一個Activity可能會收到多個回調 方法,當狀態(tài)發(fā)生變化時.產生,停止,恢復,銷毀,這些回調在適當的時機提供給您做相應工作的機會。例如,停止時,你的Activity應該釋放大型對 象,如網絡或數據庫連接。恢復Activity時,你可以重新獲得必要的資源和恢復被中斷的Activity。這些狀態(tài)轉換是所有的Activity程序 周期的一部分。

3、創(chuàng)建Activity

a. 概述

要生成一個Activity,你必須生成一個Activity子類Activity(或已有的子類)。在你的子類中,創(chuàng)建,停止,恢復或銷毀 Acitivty時,你需要實現回調方法,系統(tǒng)調用時,用這些方法在Activity生命周期的各種狀態(tài)之間的轉換。兩個最重要的回調方法是:

onCreate():必須實現這個方法。生成Activity時系統(tǒng)調用。在你實現中,你應該初始化您的Activity中的組件。最重要的是,這是你必須調用 setContentView() 定義Activity的用戶界面的布局。

onPause():當用戶離開你的Activity時候(盡管它并不總是意味著被銷毀Activity),系統(tǒng)調用此方法。通常如果你需要保持當前會話的話,你所有的改動都應在這提交(因為用戶可能不返回)。

還有其他幾個生命周期回調方法,你應該使用這些方法處理Activity與導致使Activity必須停止,甚至銷毀的突發(fā)中斷之間的事情,來提供流暢的用戶體驗。所有的生命周期回調方法將在稍后討論,在有關 管理Activity生命周期部分。

b. 實現用戶界面

一個Activity的用戶界面是由一組按層派生視圖類-View的視圖對象組成。每個視圖控制Activity窗口的特定矩形空間,以響應用戶交互。例如,一個視圖可能是一個按鈕,當用戶觸摸它啟動一個操作。

Android提供了一些現成的視圖,你可以用它來​​設計和組織布局。“Widgets”就是視圖-view,他提供一個可視的可交互的屏幕元素,如按鈕,文本字段,復選框,或只是一個圖象。“布局”是從視圖組-ViewGroup派生的,提供了對子視圖特殊的布局模式,如線性布局,網格布局,或相對布局的視圖組。還可以繼承視圖類-View和視圖組 - ViewGroup(或現有的子類)來創(chuàng)建自己的Widgets和布局,并將其應用到您的Activity布局中。

最常見的方式來定義一個布局,是一個XML布局文件保存您的應用程序資源。這種方式,你可以單獨從源代碼中維護你的用戶界面設計以及定義Activity 的行為。你可以通過setContentView()設置您的Activity的UI布局 ,傳入布局的資源ID。或者,你也可以在Activity代碼中生成新的視圖-View,新建立一個視圖 - View層次結構插入到視圖組-ViewGroup ,然后傳入根視圖組-ViewGroup給setContentView()進行布局。

c. 在manifest文件中聲明Activity

   要在系統(tǒng)中使用Activity,您必須在manifest文件中聲明您的Activity。打開你的manifest文件,并添加 <activity-element>>作為 <application><application> 元素一個子元素。例如:

  1. <manifest ... >   
  2.    <application ... >   
  3.        <activity android:name=".ExampleActivity" />   
  4.        ...   
  5.    </application ... >   
  6.    ...   
  7. </manifest >   

在這個元素可以包含其他一些屬性,包括定義屬性,如Activity的標簽,圖標的Activity,或Activity的主題UI風格。 屬性android:name 是唯一需要的屬性,它指定Activity的類名。一旦你發(fā)布你的應用程序,你不應該改變這個名字,因為如果這樣做,你可能會破壞一些功能,如應用程序的快捷方式。

d. 使用intent過濾器

一個 <activity> 元素也可使用 <intent-filter>的元素指定的各種intent過濾器,以說明其他應用程序組件可以如何激活它。

當你使用Android SDK工具為您創(chuàng)建一個新的應用,<activity>標簽下自動包括用于聲明Activity響應main的動作的intent過濾器和用于啟動的lancher分類。intent 過濾器看起來像這樣:

  1. <activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">   
  2.     <intent-filter>   
  3.         <action android:name="android.intent.action.MAIN" />   
  4.         <category android:name="android.intent.category.LAUNCHER" />   
  5.     </intent-filter>   
  6. </activity>  

<action> 元素指定應用程序main的入口。 <category> 元素指定系統(tǒng)的activity列表上應用啟動的Activity,(允許用戶啟動這個Activity)。

如果你打算讓您的應用程序成為一個獨立的應用,不允許其他應用程序啟動應用中的Activity,那你就不需要其他的intent過濾器。 如前面示例所示,只有一個Activity帶有main動作和launcher類別。你 不讓其他Activity用于其他應用程序,那他們不應有任何intent過濾器,你必須顯示的調用intent啟動他們。

但是,如果您希望您的 Activity響應其他應用程序(和自己)的隱式intent,那么你必須在您的Activity中定義額外的intent過濾器。為了響應你需要響應 的每種intent,你必須包括 <intent-filter> ,其中包括一個 <action> 元素的和一個可選的 <category> 元素和/或 <data> 元素。這些元素指定你的Activity可以響應的intent類型。

4、啟動Activity

你就可以通過調用 startActivity(android.content.Intent) startActivity()啟動另一個Activity,它傳遞一個Intent描述你要啟動的Activity。intent指定你要啟動的 Activity,或描述要執(zhí)行的動作類型(系統(tǒng)為您選擇合適的Activity,甚至可能是他應用程序的Activity)。intent也可攜帶少量 數據被用于要啟動的Activity。

在自己的應用程序中,你會經常需要簡單地啟動一個已知的Activity。你可以使用類名來創(chuàng)建一個intent,明確定義你要啟動的Activity。另 外,您的應用程序可能還需要執(zhí)行一些動作,例如發(fā)送電子郵件,文字信息,或狀態(tài)更新,使用Activity中的數據。在這種情況下,你的應用程序可能無法 有其自身的Activity,執(zhí)行這些行動,所以你可以轉而利用設備上其他應用程序提供的Activity為您執(zhí)行。這是intent真正有價值的地方 ——你可以創(chuàng)建一個描述了要執(zhí)行的一個動作的intent,系統(tǒng)從另一個應用程序啟動的適當Activity。

如果有多個Activity可以處理的intent,那么用戶可以選擇使用哪一個。例如,如果你想允許用戶發(fā)送電子郵件,你可以創(chuàng)建以下intent:

  1. Intent intent = new Intent(Intent.ACTION_SEND); 
  2. intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); 
  3. startActivity(intent); 

a. 啟動activity的返回結果

有時,您要取得你啟動的Activity的結果。使用Activity的startActivityForResult()。然后在后續(xù)實現了 onActivityResult()回調方法的Activity中取得結果。后續(xù)Activity完成后,它會返回一個intent給您 onActivityResult()方法。

  1. private void pickContact() { 
  2.     / /根據CONTENT PROVIDER URI定義,建議一個用于選擇聯(lián)系人得 INTENT 
  3.        Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 
  4.     startActivityForResult(intent, PICK_CONTACT_REQUEST); 
  5.  } 
  6.   
  7.  @Override 
  8.  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
  9.     / /如果請求正常(OK)并且請求是PICK_CONTACT_REQUEST  
  10.      if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { 
  11.         / /查詢 content provider 取得聯(lián)系人的名字  
  12.         Cursor cursor = getContentResolver().query(data.getData(), 
  13.         new String[] {Contacts.DISPLAY_NAME}, nullnullnull); 
  14.         if (cursor.moveToFirst()) { // 游標不為空 
  15.             int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME); 
  16.             String name = cursor.getString(columnIndex); 
  17.             // 對選中名字的人進行處理... 
  18.         } 
  19.     } 
  20.  } 

5、關閉Actvity

您可以通過調用 finish()方法關閉Activity的。你也可以通過調用 finishActivity()關閉之前您啟動的一個獨立的Activity 。注意:在大多數情況下,你應該不需要顯示地使用這些方法結束Activity。在下面一節(jié)討論有關的Activity生命周期,Android系統(tǒng)為你管理Activity, 所以你不需要來自己結束Activity。調用這些方法可對用戶體驗產生影響,只有你確定不想讓用戶返回此Activity實例時使用。

6、管理Activity生命周期

a. 實現生命周期函數

activity_lifecycle.png

b. 保存activity狀態(tài)

恢復狀態(tài):在管理Activity生命周期中提到當Activity暫?;蛘咄V沟臅r候,會保留Activity狀態(tài)。因為當他暫?;蛘咄V沟臅r候,內存中 仍然有 Activity 對象,并且包含成員信息和當前的狀態(tài),因此,在用戶模式下的任何對Activity的操作,在Activity返回到前臺的時候將被還原("恢復狀態(tài)")。

重新運行狀態(tài):在Activity變得不太穩(wěn)定的前,系統(tǒng)調用 onSaveInstanceState() 。該系統(tǒng)傳遞給其一個 Bundle,您可以在其中以名稱-值對的形式保存為有關Activity的狀態(tài)信息,如使用方法 putString()和 putInt() 。然后,如果系統(tǒng)kill你的應用進程,當用戶返回Activity,系統(tǒng)重建Activity時,系統(tǒng)會同時傳給 onCreate() 和 onRestoreInstanceState() Bundle 。

使用這兩種方法,你可以從 Bundle 提取到保存的狀態(tài)信息來恢復Activity。如果沒有恢復的狀態(tài)信息, Bundle傳遞的是空(***創(chuàng)建Activity的情況)。由于onSaveInstanceState() 的默認實施能保存UI的狀態(tài),如果要為保存額外的狀態(tài)信息而重寫此方法,那么在做任何工作之前,你一定要在實現 onSaveInstanceState() 之前調用其超類方法。

同樣,如果你重寫它,你也應該調用 onRestoreInstanceState()實現的超類方法,以此默認實現恢復視圖狀態(tài)。因為 onSaveInstanceState() 不能保證被調用,所以當用戶離開Activity,你應該只使用它記錄Activity的瞬時狀態(tài)(UI的狀態(tài)),你不應該用它來​​存儲持久數據。相 反,你應該使用 onPause() 存儲持久數據(如保存到數據庫中的數據)。

    restore_instance.png

c. 處理配置改變

    某 些設備配置在運行時可以改變(如屏幕方向,鍵盤的可用性,和語言)。當這種變化發(fā)生時,Android重新運行Activity(系統(tǒng)調用的 onDestroy(),然后立即調用的 onCreate())。這種行為旨在幫助您用您所提供的(如不同的屏幕方向和大小不同的布局)的替代資源進行應用程序自動重載,以適應新的配置。如果你 正確地設計Activity,以處理由于屏幕方向的變化帶來的重新啟動并按照如上所述恢復Activity狀態(tài),那么您的應用程序在Activity生命 周期中對于其他突發(fā)事件的應對將更具彈性。處理重新啟動來保存和恢復Activity狀態(tài)的一個的***方式是使用onSaveInstanceState()和onRestoreInstanceState()(或onCreate())。

7、協(xié)調Activities

   在同一進程中兩個Activity中,當Activity A 啟動Acivity B是產生的操作順序:

1.Activity A執(zhí)行onPause()方法;

2.Activity B按照onCreate(),OnStart(),onResume()的順序執(zhí)行方法。(ActivityB現在取得用戶的焦點。)

3.如果ActivityA已不再是顯示在屏幕上,它執(zhí)行方法onStop()。

這個可預測的生命周期回調順序,可讓您管理的從一個Activity到另一個Activity的轉換信息。例如,如果***個Activity停止時你必須寫數據庫 , 讓之后的Activity讀取數據庫,那么你應該在onPause()期間寫數據庫而不是onStop()。

責任編輯:徐川 來源: csdn
相關推薦

2016-12-09 09:23:50

android組件Service

2014-03-27 15:34:55

Android組件Activity

2014-03-27 15:57:45

Android組件Activity

2014-07-31 10:57:15

Android組件Service

2010-08-05 10:22:46

Flex效果

2013-01-17 15:51:42

Android開發(fā)應用程序組件

2015-07-17 09:50:16

Carthage優(yōu)劣比較

2010-09-15 13:35:25

SwingHibernateStruts

2024-12-30 11:24:56

APMZipkinPinpoint

2010-11-03 11:10:04

AndroidiPhone

2012-02-08 13:52:30

云計算

2024-02-22 14:04:04

開發(fā)框架

2010-08-17 09:20:28

DIV布局

2015-10-22 10:48:47

Android四大組件攔截

2010-09-01 11:01:02

iUIjQTouchSencha Touc

2014-12-17 10:43:01

Hybrid App平臺開發(fā)

2022-03-16 23:17:57

React JS前端工具

2011-03-21 09:01:49

CSS框架

2013-12-26 15:43:07

Android開發(fā)Android應用Activities

2013-09-24 10:32:31

Android開發(fā)者工具
點贊
收藏

51CTO技術棧公眾號