Application和Actovotu,Service同樣是android框架的一個系統組件,當android程序啓動時系統會建立一個 application對象,用來存儲系統的一些信息。一般咱們是不須要指定一個Application的,這時系統會自動幫咱們建立,若是須要建立本身 的Application,也很簡單建立一個類繼承 Application並在manifest的application標籤中進行註冊(只須要給Application標籤增長個name屬性把本身的 Application的名字定入便可)。java
android系統會爲每一個程序運行時建立一個Application類的對象且僅建立一個,因此Application能夠說是單例 (singleton)模式的一個類.且application對象的生命週期是整個程序中最長的,它的生命週期就等於這個程序的生命週期。由於它是全局 的單例的,因此在不一樣的Activity,Service中得到的對象都是同一個對象。因此經過Application來進行一些,數據傳遞,數據共享 ,數據緩存等操做。android
第一步、寫一個全局的單例模式的MyApplication繼承自Application 覆蓋onCreate ,在這個方法裏面實例化Application緩存
第二步、配置全局的Context網絡
<application Android:name="com.appstore.service.MyApplication" ></application>app
第三步、使用,使用的時候用的時候根據類的名稱訪問Context框架
其實在android.app.Application這個包的onCreate纔是真正的Android入口點,只不過大多數開發者無需重寫該類,他的繼承關係以下圖:ide
java.lang.Object
? android.content.Context
? android.content.ContextWrapper
? android.app.Application網站
android.app.Application類包含了4個公開的方法this
void onConfigurationChanged(Configuration newConfig)
void onCreate() //這裏纔是真正的入口點。
void onLowMemory()
void onTerminate()spa
因此但願你們,記住真正的Android入口點是application的main,你能夠看下androidmanifest.xml的包含關係就清楚了,並非每一個應用都必須有Activity的。
public void onCreate()
在應用程序建立的時候被調用,能夠實現這個這個方法來建立和實例化任何應用程序狀態變量或共享資源。還能夠在這個方法裏面獲得 Application 的單例。
public void onTerminate ()
當終止應用程序對象時調用,不保證必定被調用,當程序是被內核終止以便爲其餘應用程序釋放資源,那麼將不會提醒,而且不調用應用程序的對象的onTerminate方法而直接終止進程。
public void onLowMemory()
當系統資源匱乏的時候,咱們能夠在這裏能夠釋放額外的內存, 這個方法通常只會在後臺進程已經結束,但前臺應用程序仍是缺乏內存時調用。能夠重寫這個方法來清空緩存或者釋放沒必要要的資源。
public void onTrimMemory(int level)
當運行時決定當前應用程序應該減小其內存開銷時(一般在進入後臺運行的時候)調用,包含一個 level 參數,用於提供請求的上下文。
public void onConfigurationChanged (Configuration newConfig)
與 Activity 不一樣,配置改變時,應用程序對象不會被終止和重啓。若是應用程序使用的值依賴於特定的配置,則重寫這個方法來加載這些值,或者在應用程序級處理配置值的改變。
假若有一個Activity A, 跳轉到 Activity B ,並須要傳遞一些數據,一般的做法是 Intent.putExtra() 讓Intent攜帶,或者有一個Bundle把信息加入Bundle讓Intent傳遞Bundle對象,實現傳遞。但這樣有一個問題在於,Intent 和 Bundle 所能攜帶的數據類型都是一些基本的數據類型,若是想實現複雜的數據傳遞就比較麻煩了,一般須要實現 Serializable 或者 Parcellable 接口。這實際上是Android的一種IPC數據傳遞的方法。若是咱們的兩個Activity在同一個進程當中爲何還要這麼麻煩呢,只要把須要傳遞的對象的引用傳遞過去就能夠了。
基本思路是:在 Application 中建立一個 HashMap ,以字符串爲key,Object爲value這樣咱們的 HashMap 就能夠存儲任何類型的對象了。在Activity A中把須要傳遞的對象放入這個HashMap,而後經過 Intent 或者其它途徑再把這 key 傳遞給Activity B ,Activity B 就能夠根據這個字符串在 HashMap 中取出這個對象了。只要再向下轉型 ,就實現了對象的傳遞。
定義兩個Activity: MainActivity.java 和 MainActivity2.java, 代碼是同樣的
1 TextView tv; 2 EditText et; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 //setContentView(R.layout.activity_main_activity2); 8 setContentView(R.layout.activity_main2); 9 10 tv = (TextView) findViewById(R.id.tv); 11 et = (EditText) findViewById(R.id.et); 12 13 tv.setText("共享數據:" + getApp().getTextData()); 14 15 findViewById(R.id.btnTextData).setOnClickListener(new OnClickListener() { 16 @Override 17 public void onClick(View v) { 18 getApp().setTextData(et.getText().toString()); 19 tv.setText("共享數據:" + et.getText().toString()); 20 } 21 }); 22 } 23 24 public App getApp() { 25 return ((App)getApplicationContext()); 26 }
定義一個類App,集成Application
1 public class App extends Application { 2 3 private String textData = "default"; 4 5 public void setTextData(String textData) { 6 this.textData = textData; 7 } 8 public String getTextData() { 9 return textData; 10 } 11 }
修改AndroidManifest.xml文件, 使用自定義的Application,兩個Activity都是入口:
1 <application 2 android:name="com.carloz.learnapplication.App" 3 android:allowBackup="true" 4 android:icon="@drawable/ic_launcher" 5 android:label="@string/app_name" 6 android:theme="@style/AppTheme" > 7 <activity 8 android:name=".MainActivity" 9 android:label="@string/app_name" > 10 <intent-filter> 11 <action android:name="android.intent.action.MAIN" /> 12 13 <category android:name="android.intent.category.LAUNCHER" /> 14 </intent-filter> 15 </activity> 16 <activity 17 android:name="com.carloz.learnapplication.MainActivity2" 18 android:label="@string/title_activity_main_activity2" > 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 </application>
結果,在一個Activity修改App的數據,在另外一個Activity都能獲取到
在 Application 中創建兩個 HashMap 一個用於數據的傳遞,一個用於緩存一些數據。好比有一個Activity須要從網站獲取一些數據,獲取完以後咱們就能夠把這個數據先存到Application 當中,當頁面跳轉到其它 Activity 再回來的時候,就能夠直接使用緩存好的數據了。但若是須要cache一些大量的數據,最好是cache一些 (軟引用)SoftReference ,並把這些數據cache到本地Rom 上或者 SDCard上。若是在 Application 中的緩存不存在,從本地緩存查找,若是本地緩存的數據也不存在再從網絡上獲取。