【 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 教學 / 開發

參考資料:

留言

張貼留言

回覆意見時,麻煩輸入一下暱稱
(隨便取個名字也好~ ^_^)
好讓我方便回覆您的問題,
選擇「名稱/網址」輸入您的暱稱,
麻煩一下,謝謝大家。

這個網誌中的熱門文章

16天記下7000單字

[推薦]目前當代具有相當權威的英語辭典整理收集