Application和Activity,Service一樣是Android框架的一個(gè)系統(tǒng)組件鲜滩,當(dāng)Android程序啟動(dòng)時(shí)系統(tǒng)會(huì)創(chuàng)建一個(gè)Application對(duì)象过椎,用來(lái)存儲(chǔ)系統(tǒng)的一些信息夺衍。
Android系統(tǒng)自動(dòng)會(huì)為每個(gè)程序運(yùn)行時(shí)創(chuàng)建一個(gè)Application類(lèi)的對(duì)象且只創(chuàng)建一個(gè)捐迫,所以Application可以說(shuō)是單(singleton)模式的一個(gè)類(lèi)。
通常我們是不需要指定一個(gè)Application的籽腕,系統(tǒng)會(huì)自動(dòng)幫我們創(chuàng)建嗡呼,如果需要?jiǎng)?chuàng)建自己Application,那也很簡(jiǎn)單皇耗!創(chuàng)建一個(gè)類(lèi)繼承Application并在AndroidManifest.xml文件中的application標(biāo)簽中進(jìn)行注冊(cè)(只需要給application標(biāo)簽增加name屬性南窗,并添加自己的 Application的名字即可)。
啟動(dòng)Application時(shí)郎楼,系統(tǒng)會(huì)創(chuàng)建一個(gè)PID万伤,即進(jìn)程ID,所有的Activity都會(huì)在此進(jìn)程上運(yùn)行呜袁。那么我們?cè)贏pplication創(chuàng)建的時(shí)候初始化全局變量壕翩,同一個(gè)應(yīng)用的所有Activity都可以取到這些全局變量的值,換句話說(shuō)傅寡,我們?cè)谀骋粋€(gè)Activity中改變了這些全局變量的值,那么在同一個(gè)應(yīng)用的其他Activity中值就會(huì)改變北救。
Application對(duì)象的生命周期是整個(gè)程序中最長(zhǎng)的荐操,它的生命周期就等于這個(gè)程序的生命周期。因?yàn)樗侨值膯卫恼洳撸栽诓煌腁ctivity,Service中獲得的對(duì)象都是同一個(gè)對(duì)象托启。所以可以通過(guò)Application來(lái)進(jìn)行一些,如:數(shù)據(jù)傳遞攘宙、數(shù)據(jù)共享和數(shù)據(jù)緩存等操作屯耸。
應(yīng)用場(chǎng)景:
在Android中,可以通過(guò)繼承Application類(lèi)來(lái)實(shí)現(xiàn)應(yīng)用程序級(jí)的全局變量蹭劈,這種全局變量方法相對(duì)靜態(tài)類(lèi)更有保障疗绣,直到應(yīng)用的所有Activity全部被destory掉之后才會(huì)被釋放掉。
實(shí)現(xiàn)步驟:
1铺韧、在ApplicationManifest.xml文件中配置自定義的Application
<pre><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.test"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name=".CustomApplication">
<activity
android:name=".FirstActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/app_name">
</activity>
</application>
</manifest></pre>
2多矮、CustomApplication.java示例代碼
<pre>** //繼承Application * *
public class CustomApplication extends Application {
private static final String VALUE = "Harvey";
private String value;
@Override
public void onCreate() {
super.onCreate();
setValue(VALUE); // 初始化全局變量
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}</pre>
注:繼承Application類(lèi),主要重寫(xiě)里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口點(diǎn)),就是創(chuàng)建的時(shí)候塔逃,初始化變量的值讯壶。然后在整個(gè)應(yīng)用中的各個(gè)文件中就可以對(duì)該變量進(jìn)行操作了。
FirstActivity.java示例代碼
<pre>public class FirstActivity extends Activity {
private CustomApplication app;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
app = (CustomApplication) getApplication(); // 獲得CustomApplication對(duì)象
Log.i("FirstActivity", "初始值=====" + app.getValue()); // 獲取進(jìn)程中的全局變量值湾盗,看是否是初始化值
app.setValue("Harvey Ren"); // 重新設(shè)置值
Log.i("FirstActivity", "修改后=====" + app.getValue()); // 再次獲取進(jìn)程中的全局變量值伏蚊,看是否被修改
Intent intent = new Intent(); intent.setClass(this, SecondActivity.class);
startActivity(intent);
}
}</pre>
注:只需要調(diào)用Context的getApplicationContext或者Activity的getApplication方法來(lái)獲得一個(gè)Application對(duì)象,然后再得到相應(yīng)的成員變量即可格粪。它是代表我們的應(yīng)用程序的類(lèi)躏吊,使用它可以獲得當(dāng)前應(yīng)用的主題和資源文件中的內(nèi)容等,這個(gè)類(lèi)更靈活的一個(gè)特性就是可以被我們繼承匀借,來(lái)添加我們自己的全局屬性颜阐。
SecondActivity.java示例代碼
<pre>public class SecondActivity extends Activity {
private CustomApplication app;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
app = (CustomApplication) getApplication(); // 獲取應(yīng)用程序
Log.i("SecondActivity", "當(dāng)前值=====" + app.getValue()); // 獲取全局值
}
}</pre>