標籤:activity android應用 執行個體
Android應用程式由一些零散的有聯絡的組件組成,通過一個工程manifest綁定在一起。在manifest中,描述了每一個組件以及組件的作用,其中有6個組件,它們是Android應用程式的基石。
- Activities(活動)
- Service(服務)
- Content Provider(內容提供者)
- Intent(意圖)
- Broadcast Receiver(廣播接收器)
- Notification(通知)
在這裡我們提到了組件(Component)的概念,組件(Component)是對資料和方法的簡單封裝,組件可以有自己的屬性和方法。屬性是組件資料的簡單訪問者。方法則是組件的一些簡單而可見的功能。使用組件可以實現拖放式編程、快速的屬性處理以及真正的物件導向的設計。談及所謂架構和重用的時候,組件是難以迴避的概念。在此我們再擴充一下,瞭解一下Android的面向組件思想。
【部落格專欄:http://blog.csdn.net/column/details/alearning.html】
【以下摘自CSDN部落格:http://blog.csdn.net/luoxinwu123/article/details/8019547】
面向組件思想是在軟體規模擴大,複雜度上升的背景下,以物件導向為基礎而提出的一種軟體設計思想。可以把它理解為一種更粗粒度的物件導向,其粒度一般大於對象,但具體要到什麼程度,又可以根據實際情況來決定。這種思想以組件為基礎,強調“服務”的概念。
面向組件具有以下特點:
低耦合性:組件之間一般互不依賴,一個組件只需要知道另一個組件的“名字”就可以訪問它;
高重用性:系統級的重用;
高互通性:不同的開發商開發出來的組件只要定義好了介面就可以互相訪問;
進程的透明性:組件可以工作在同一個進程也可以工作在不同的進程;
語言和開發環境的獨立性:組件只需要定義好服務介面,內部實現可以採用任何語言。
面向組件的架構已經有很多了,如JavaBean、EJB、COM等。Android系統並沒有聲稱自己是面向組件的,但從其設計思想來看,Android一開始的設計考慮就是要採用一種“無邊界”的設計方式,要實現系統內資源高度的重用。
事實上,Android完全符合面向組件的特徵。首先,Android提供了Activity、Service、BroadcastReceiver和ContentProvider四大組件。這四大組件之間的協作是通過Binder機制和來協作的,其中ServiceManager與ActivityManagerService是保證組件間協同工作的最重要的基礎,同時它們本身也是一種組件。ServiceManager是Binder的守護進程,用來管理各種服務,並向調用這些服務的客戶提供查詢遠程介面的功能。而ActivityManagerService負責所有Activity和Service的啟動,另外還負責系統中所有廣播的註冊和發布以及把廣播發送給接收者。
本章將主要以案例的方式逐步介紹相關基本組件的概念、知識點與使用方式。接下來一起進行第一個基本組件Activity的學習。
Activity(活動)
首先我們需要明確對Activity(活動)的理解,Activity是使用者與應用程式的互動的介面,即提供某個可視化的圖文介面,同時是一組控制項的容器,即我們可以把我們需要的控制項添加在Activity活動介面中。
建立Activity需要繼承android.app.Activity對象產生對應的子類。一般情況下,我們需要重寫(覆蓋)方法
protected void onCreate(Bundle savedInstanceState)
較為深入的瞭解Activity,需要明白與說明Activity的生命週期。首先看看android developers 網上的activity的生命週期圖,如所示:
在 Android 中,Activity 擁有四種基本狀態:
1. Active/Runing:一個新的Activity入棧後,它在螢幕最前端,處於棧的最頂端,處於可見並且可互動的啟用狀態。
2. Paused:當 Activity 被另一個透明或者 Dialog 樣式的 Activity 覆蓋時的狀態。此時它依然與視窗管理器保持串連,系統繼續維護其內部狀態,所以它仍然可見,但它已經失去了焦點故不可與使用者互動。
3. Stoped:當 Activity 被另外一個 Activity 覆蓋、失去焦點並不可見時的狀態。
4. Killed:Activity 被系統殺死回收或者沒有被啟動時的狀態。
Activtiy的生命週期涉及的方法:
? protected void onCreate(Bundle savedInstanceState):一個 Activity 的執行個體被啟動時調用的第一個方法。一般情況下,我們都覆蓋該方法作為應用程式的一個進入點,在這裡做一些初始化資料、設定使用者介面等工作。大多數情況下,我們都要在這裡從 xml 中載入設計好的使用者介面。
? protected void onStart():該方法在 onCreate() 方法之後被調用,或者在 Activity 從 Stop 狀態轉換為 Active 狀態時被調用。
? protected void onResume() :在 Activity 從 Pause 狀態轉換到 Active 狀態時被調用。一般在這塊做資料恢複工作。
? protected void onPause(): 在 Activity 從Active狀態轉換到Pause 狀態時被調用。一般我們在這裡儲存 Activity 的狀態資訊。
? protected void onStop() :在 Activity 從 Active 狀態轉換到 Stop 狀態時被調用。
? protected void onDestroy() :在 Active 被結束時調用,它是被結束時調用的最後一個方法,在這裡一般做些釋放資源,清理記憶體等工作。
? protected void onRestart(): 在 Activity 從 Stop 狀態轉換為 Active 狀態時被調用,不經常使用。
建立完Activity後,需要在AndroidMainifest.xml檔案中註冊已建立的Activity,本例的Activity為TestActivity。
<activity android:name="cn.mahaochen.app.alearning.chapter5.TestActivity" android:screenOrientation="portrait" ></activity>
在此我們拓展一下知識與複習原來的知識點,關於AndroidMainifest.xml的屬性配置。
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mahaochen.activity" android:versionCode="1" android:versionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" > <!-- .表示MainActivity是當前包com.mahaochen.activity下的類。如果類在應用的當前包下,可以省略點符號;如果類在應用的子包下必須加點, 如:MainActivity類在com.mahaochen.activity.user包下可以這樣寫:<activity android:name=".user.MainActivity" /> --> <activity android:name=".MainActivity" android:label="@string/app_name" > <!-- 1、一個應用程式可以有多個Activity,每個Activity是同層級的,那麼在啟動程式時,最先啟動哪個Activity呢? 有些程式可能需要顯示在程式列表裡,有些不需要。怎麼定義呢? android.intent.action.MAIN決定應用程式最先啟動的Activity android.intent.category.LAUNCHER決定應用程式是否顯示在程式列表裡 2、因為你的程式可能有很多個activity只要xml設定檔中有這麼一個intent-filter,而且裡面有這個launcher,那麼這個activity就是點擊程式時最先啟動並執行那個activity。 3、現在只有一個activity,那麼加不加就沒有關係了。用於模擬器啟動時設定為預設開啟為的activity。 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="7" /></manifest>
案常式序
【TestActivity.java】
import cn.mahaochen.app.alearning.R;import android.app.Activity;import android.os.Bundle;import android.util.Log;public class TestActivity extends Activity{private final static String TAG = "MaHaochen_TestActivity";/** * 通常情況下覆蓋本方法,載入指定的ContentView資源布局 */@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_chapter5_activity);Log.e(TAG, "Activity_onCreate");}@Overrideprotected void onStart() {super.onStart();Log.e(TAG, "Activity_onStart");}@Overrideprotected void onResume() {super.onResume();Log.e(TAG, "Activity_onResume");}@Overrideprotected void onPause() {super.onPause();Log.e(TAG, "Activity_onPause");}@Overrideprotected void onStop() {super.onStop();Log.e(TAG, "Activity_onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.e(TAG, "Activity_onDestroy");}@Overrideprotected void onRestart() {super.onRestart();Log.e(TAG, "Activity_onRestart");}}
【activity_chapter5_activity.xml】
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Activity學習" /><ImageView android:src="@drawable/chapter5_activity_lifecycle" android:layout_height="wrap_content" android:layout_width="match_parent"/></LinearLayout>
效果
參考資料1、 http://blog.csdn.net/bage1988320/article/details/6855774
2、 http://www.oschina.net/question/54100_27841
3、 http://blog.csdn.net/android_robot/article/details/6906243