Android基礎之三:Application

  • Application是Android系統級組件之一,可是並不在Android四大組件之列,在應用程序整個生命週期中Application系統會自動實例化一個惟一的對象,更改Application的配置並不會使Android應用程序重啓,而Activity配置發生改變會形成Activity的重啓
  • Application是單例模式類的典型體現
  • 通常不須要本身建立Application類,可是出於某些須要能夠自定義Application類
    • 編寫一個類繼承自Application
    • public class UApplication extends Application{
          private static UApplication mApplication;
          @Override
          public void onCreate() {
              super.onCreate();
              mApplication=this;
          }
          public static UApplication getInstance() {
              return mApplication;
          }
      }
    • 在Manifest配置文件中使用自定義的Application
    • <application
                  android:label="@string/app_name"
                  android:allowClearUserData="true"
                  android:name=".UApplication"
                  android:theme="@android:style/Theme.Holo.Light"
                  android:icon="@drawable/ic_launcher">
              <activity
                  android:name="MyActivity"
                  android:launchMode="standard"
                  android:windowSoftInputMode="adjustResize"
                  android:icon="@drawable/back6"
                  android:label="主頁">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN"/>
                      <category android:name="android.intent.category.LAUNCHER"/>
                  </intent-filter>
              </activity>
              <activity android:name=".TAct"
                        android:icon="@drawable/logo"
                        android:parentActivityName=".MyActivity"
                        android:label="TAct">
              </activity>
              <service android:name=".MService"/>
          </application>
  • 啓動Application時,系統會建立一個PID,即進程ID,全部的Activity將在該進程中執行
  • Application對象的聲明週期是整個應用中最長的,與程序的生命週期同樣,同時由於是單態的,所以可以實現跨Activity實現數據共享、數據傳遞和數據緩存
  • Application進行數據共享的優勢:
    • Application在程序聲明週期中一直存在,在其中聲明的成員屬性等可以一直存在,同時當數據發生改變時,Activity中的數據都會發生改變
    • 只有在全部Activity被destory後纔會釋放,數據有保障
  • 雖然Application進行數據共享是頗有效且經常使用的方法,可是若是數據量較大,在Application中保存大量數據會形成應用反應遲鈍,不利於應用性能提高,所以在數據量大時給出的策略是:
    • 使用另外的單態類來進行數據存儲,在須要使用的時候進行實例化,而不必定在Application建立的時候就實例化,在不須要使用的時候銷燬
    • 將大數據寫入到文件中,在Application中保存文件的路徑,注意,保存值在應用銷燬後會自動清理內存,可是寫入文件若是須要在destory的時候清理須要手動執行,即在生命週期事件中定義
  • Application生命週期:
    • Application的聲明週期就等因而程序的生命週期
    • 經常使用重寫生命週期
      • onCreate:Application建立,程序啓動
      • onLowMenory:系統內存不足時響應
      • onTrimMemory:系統清理內存時響應
      • onTerminate:程序終止時觸發響應,只有在模擬器中才可能觸發,在真機中不會觸發
      • onConfigurationChanged:程序配置發生改變時,例如屏幕oritation發生改變
  • Application本質上也是一個全局Context實例,所以Context可以作的事情,Application實例通常也能作,在Activity中經過getApplication()獲取Application實例
  • Application應用場景
    • 若是須要在不一樣的Activity之間進行數據共享
    • 若是須要根據Application的聲明週期進行處理

 

  • Application在Manifest中的配置
    • <application>節點做爲<manifest>的子節點存在
    • 經常使用屬性:
      • alowClearUserData:容許用戶經過系統管理方式進行清理用戶數據
      • icon:應用的圖標
      • theme:默認主題風格
      • label:應用名
      • debuggable:是否開啓測試
      • backupAgent:應用備份
      • description:應用描述
      • enabled:是否可用
      • permission:須要權限
      • persistant:開機啓動
      • process:進程,經過:來定義進程
    • 子節點
      • activity
      • receiver
      • provider
      • meta-data
    • 詳情代碼
    • <application android:allowClearUserData=["true" | "false"]
                   android:label="string resource"
                   android:icon="drawable resource"
                   android:name="string"
                   android:allowTaskReparenting=["true" | "false"]
                   android:backupAgent="string"
                   android:debuggable=["true" | "false"]
                   android:description="string resource"
                   android:enabled=["true" | "false"]
                   android:hasCode=["true" | "false"]
                   android:killAfterRestore=["true" | "false"]
                   android:manageSpaceActivity="string"
                   android:permission="string"
                   android:persistent=["true" | "false"]
                   android:process="string"
                   android:restoreAnyVersion=["true" | "false"]
                   android:taskAffinity="string"
                   android:theme="resource or theme" >
              <activity
                  android:name="MyActivity"
                  android:launchMode="standard"
                  android:windowSoftInputMode="adjustResize"
                  android:icon="@drawable/back6"
                  android:label="主頁">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN"/>
                      <category android:name="android.intent.category.LAUNCHER"/>
                  </intent-filter>
              </activity>
              <activity android:name=".TAct"
                        android:icon="@drawable/logo"
                        android:parentActivityName=".MyActivity"
                        android:label="TAct">
              </activity>
              <service android:name=".MService"/>
      </application>        
相關文章
相關標籤/搜索