【 Android 中文開放式課程 】關於 Application 三兩事


什麼是 Application?

當 Android App 程式啟動時,通常我們不需要去特別指定一個Application,系統層會自動創建一個 Application 對象,啟動Application 後,系統會創建一個 PID,即 Process ID (進程識別號碼),所有的 Activity 都會在此進程上運行。
開啟 AndroidManifest.xml 文件,我們可以看到 activity 都是包含在 Application 標籤之中,如下:
  <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
     <activity android:name=".SampleActivity"/>
     <activity android:name=".Sample2Activity"/>
    </application>

Application 用途?

Application 的生命週期是整個 App 程序中最長的,它的生命週期就等於這個App 的生命週期。因為 android 系統會為運行時,僅創建一個Application 類的對象,它是全局的單例(singleton)的,所以在不同的Activity、Service中獲得的對像都是同一個對象。所以可以透過 Application 來進行,如:資料傳遞、資料共享等操作。
我們可以使用 Application 的此特性,自定義繼承於 Application 的類,來保存一些靜態值。

如何自定義 Application ?

public class MyApplication extends Application {     
   private static final int CACHE_TIME = 5*60*1000 ; //快取失效時間  
...
}
AndroidManifest.xml 加入自定義 Application 屬性名稱:
<application
     <!-- 關鍵程式修改點,自定義 Application -- > 
    android:name = ".MyApplication"
...
...
...
    > 

使用範例:

int cache_time = MyApplication.CACHE_TIME;
我們很多時候,需要 Context 對象 ,但可能在 activity 之外,沒有 Context 對象可以引用,但又需要獲得 AppContext 對象。
比較 Low 的做法,是將 activity 或者 context 傳遞到需要調用的地方,但是這樣一來,程式碼耦合度太高,壞味道出現。
這時後,我們有更優雅的做法,在自定義加入可獲取 Context 對象可以引用。
public class MyApplication extends Application {                                                                          
...

private static MyApplication mInstance ;  
public static synchronized MyApplication getInstance () {   
    return mInstance ;
} 
@Override
public void onCreate () {  
    super.onCreate ();
    mInstance = this ; 
}
...
}

使用範例:

...
//在非 activity 類中,獲取資源字串文件資料
String login_msg = MyApplication.getInstance().getString(R.string.login_msg);
...
Ps. 另外一提,我們使用第三方 lib 套件或是SDK ,有時需要進行初始化元件,就也會在此自定義 Application,進行宣告。
HKT 線上教室 每週六日 更新影片
▶ YouTube 頻道
https://goo.gl/3f2pJi
▶ KT 線上教室 臉書粉絲團
https://goo.gl/27H9Li
▶ 贊助我們
https://goo.gl/FiKXAu
▶2017 Android 中文開放式課程 目錄
https://goo.gl/Ti8mGA
Android 8 Oreo / Android Studio
Android 教學 / 開發

參考資料:

這個網誌中的熱門文章

2023 最新入門零基礎 Kotlin教學【從零開始學 Kotlin 程式設計】Kotlin 教學課程目錄 (Android Kotlin, IntelliJ IDEA, Android Studio, Android APP 開發教學)

nano 文字編輯器

最新入門零基礎 Java 教學【從零開始學 Java 程式設計】Java教學課程目錄 (IntelliJ IDEA 開發教學)

2022 最新入門零基礎 Flutter教學 【Flutter 程式設計入門實戰 30 天】Flutter 教學課程目錄 (IntelliJ IDEA 開發教學)

Android Studio 歷代版本下載點