首先,在一個Android程序中,有且只有一個Application對象,在程序開始跑起來的時候,首先執行Application的onCreate方法,這是一個Android應用的入口,在開發中,我們常常自定義一個MyApplication用來執行某些操作。由於在一個程序中,有且只有一個Application對象,所以我們可以使用單例設計模式,(這句話是錯誤的!因為單例模式需要把構造函數私有,但是Application的構造函數是不能私有的,所以不能使用單例模式,其實也沒有必要這樣做)下面簡單的介紹一下自定義Application的使用。
/**
* 自定義Application對象
* @Package com.example.myallutils
*
* TODO
* @author ZhaoKaiQiang
*
* @time 2014年5月6日
*/
public class MyApplication extends Application {
//這是Android程序的入口
@Override
public void onCreate() {
super.onCreate();
}
}
自定義完Application對象就可以了嗎?當然不是,還需要在AndroidManifest.xml中進行配置
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:name="com.example.myallutils.MyApplication"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar" >
<activity android:name="com.example.myallutils.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
這樣就可以使用我們自己的Application了。
那么自定義了MyApplication到底有什么用呢?
目前我接觸到的使用到Application的工作場景主要有兩個。
1.數據共享
在Activity中我們可以使用getApplication獲取到我們的Application對象,這樣我們就可以使用Application對象在不同的Activity之間進行數據的傳輸。
比如在軟件剛登陸的時候,我需要獲取之前用戶登錄的賬號信息,這些信息保存在了sharedpreferences中,那么我們就可以在MyApplication的onCreate方法中對這些數據進行初始化,保存在一個變量中,這樣當我們在其他的頁面需要用到這些用戶信息的時候,我們就可以直接從MyApplication中獲取這些信息。
2.關閉所有的Activity
徹底的關閉應用程序,網上有人提供了不少的思路,比如殺死當前進程等等,而使用Application對Activity進行管理也是一個不錯的辦法。
比如下面的代碼可以寫在我們的MyApplication中
//存放Activity對象
private List<Activity> activityList = new LinkedList<Activity>();
// 添加Activity到容器中
public void addActivity(Activity activity) {
activityList.add(activity);
}
// 遍歷所有Activity並finish
public void exit() {
for (Activity activity : activityList) {
activity.finish();
}
}
當我們新進入一個Activity的時候,在Activity的onCreate方法中調用addActivity(this);然后在程序的出口的地方,調用exit()方法,就可以關閉所有的Activity。
但是我對這個方案的時候一直有一個疑惑,就是如果我們創建的所有的Activity都在一個進程中的話,那么只要我們控制好流程,保證每個頁面在關閉的時候都調用finish(),應該不會有Activity存活才對,也就不用費盡心思想着怎么徹底的推出程序,但是如果新打開的Activity是在新的棧里面(設置啟動的模式),這樣或許就有必要這樣做了,所以如果有人可以幫我解答這個疑問,不勝感激!
