Application全域性應用
Application是維護應用全域性狀態的基類,Android系統會在啟動應用程式時建立一個對應的Application物件。所以當我們需要建立全域性變數的時候,不需要再像Java那樣需要建立public許可權的static變數,而直接在Application中去實現。其他元件只需要呼叫Context的getApplicationContext或者getApplication(在Activity中)來獲得一個Application物件,再做出相應的處理。
自定義Application
我們可以通過建立一個子類,並在AndroidManifest.xml的<application>
標籤中將該子類的標準名稱指定為"android:name" 屬性來設定為自己的實現類。
public class MyApplication extends Application {
// ...
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.tim.custom_application">
<application
android:name=".MyApplication"
...
android:theme="@style/AppTheme">
...
</application>
</manifest>
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate: " + getApplication());
}
列印出來的確實自定義的Application類物件:
MainActivity: onCreate: cn.tim.custom_application.MyApplication@9e7a3660
Application物件生命週期
Application物件誕生於其它任何元件物件之前,並且一直存活,直到應用程式結束。Application物件由Android系統管理,它的回撥函式都執行於UI執行緒。
public class MyApplication extends Application {
private static final String TAG = "MyApplication";
// Application物件被建立的時候會呼叫
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate: " + this);
Log.i(TAG, "onCreate: " + Thread.currentThread());
}
// 系統配置變更,如橫屏變成豎屏、系統語言更改
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i(TAG, "onConfigurationChanged: " + newConfig );
}
// 系統記憶體吃緊的時候被呼叫
@Override
public void onLowMemory() {
super.onLowMemory();
Log.i(TAG, "onLowMemory: ");
}
}
Application物件的作用
Application物件全域性可訪問,且全程陪同應用程式。所以特別適合完成以下任務:初始化全應用所需的服務、共享全域性狀態、監聽配置資訊改變、監聽Activity生命週期
初始化全應用所需的服務:在 Application 物件被建立時會呼叫 onCreate()方法,此時用來初始化全應用所需的服務是個不錯的選擇,但是最好執行耗時操作,否則會拖慢應用程式啟動速度。
共享全域性狀態:另外使用Application物件實現資料共享、資料快取也是一個不錯的選擇。Application物件可以獲取應用程式當前的記憶體使用情況,及時釋放資源,從而避免被系統殺死。
監聽配置資訊改變:如螢幕旋轉,系統語言切換等(下面是手機開啟橫屏的示例)。
監聽Activity生命週期:監聽應用程式內所有Activity的生命週期。
Application物件 VS 靜態單例
Application物件與靜態單例都可以實現應用全域性狀態的共享,以共享Otto的Bus物件為例:
implementation group: 'com.squareup', name: 'otto', version: '1.3.8'
這是使用Application物件進行全域性共享的示例:
MyApplication.java
public class MyApplication extends Application {
private Bus bus;
public Bus getBus() {
return bus;
}
@Override
public void onCreate() {
super.onCreate();
bus = new Bus();
}
...
}
MainActivity.java
@Override
protected void onResume() {
super.onResume();
MyApplication application = (MyApplication) getApplication();
Bus bus = application.getBus();
bus.register(this);
}
@Override
protected void onPause() {
super.onPause();
MyApplication application = (MyApplication) getApplication();
Bus bus = application.getBus();
bus.unregister(this);
}
這是使用靜態單例進行全域性共享的示例:
BusProvider.java
public class BusProvider {
private BusProvider(){}
private static final Bus bus = new Bus();
public static Bus getBus(){
return bus;
}
}
OtherActivity.java
@Override
protected void onResume() {
super.onResume();
BusProvider.getBus().register(this);
Log.i(TAG, "onResume: bus = " + BusProvider.getBus());
}
@Override
protected void onPause() {
super.onPause();
BusProvider.getBus().unregister(this);
Log.i(TAG, "onPause: bus = " + BusProvider.getBus());
}
1、靜態單例模組化程度更好
2、Application就是一個context,所以有訪問資源的能力
3、靜態單例可以接受context引數
4、Application物件能接收系統回撥,自動知悉系統環境變化
5、Application物件的生命週期由系統控制
原文地址:《Application全域性應用》
相關文章
- node 全域性物件和全域性變數物件變數
- HTML Application Cache 離線應用HTMLAPP
- Vue單頁及多頁應用全域性配置404頁面實踐Vue
- android自定義Application全域性變數不能型別轉換的問題AndroidAPP變數型別
- vue定義全域性變數和全域性方法Vue變數
- 靜態全域性變數和全域性變數變數
- 區域性代理ip與全域性代理ip怎麼用?
- AppID 的英文全稱是 Application Identifier AppID(應用程式識別符號)GUID(全域性唯一識別符號)APPIDE符號GUI
- 線上直播系統原始碼,強制應用全域性橫屏或豎屏原始碼
- 框架(frameset),全域性屬性框架
- 全域性變數變數
- vue全域性APIVueAPI
- Js全域性物件JS物件
- CMake 屬性之全域性屬性
- Laravel 原始碼筆記 應用程式 ApplicationLaravel原始碼筆記APP
- 應用程式退休(Application Retirement)解決方案APPREM
- vue2.0全域性路由守衛(全域性控制登入)Vue路由
- 微信小程式的全域性彈窗以及全域性例項微信小程式
- html5全域性屬性HTML
- 本地索引和全域性索引的適用場景索引
- 什麼是 Angular 應用的 browser Application bundles 和 server Application bundleAngularAPPServer
- 超全域性陣列有哪些?超全域性陣列有什麼作用?陣列
- 短視訊開發app,Android 強制應用全域性橫屏或豎屏APPAndroid
- Flutter 全域性彈窗Flutter
- 全域性 DOM 變數變數
- 全域性CSS的配置CSS
- flex全域性異常Flex
- Mycat 全域性系列號
- lua全域性變數變數
- 全域性臨時表
- Application Wizard for Mac應用程式快速啟動工具APPMac
- HTML5應用程式快取Application CacheHTML快取APP
- Websphere Application Server 環境配置與應用部署WebAPPServer
- Spring Boot 應用使用 application.yml 和 application.properties 的區別Spring BootAPP
- 以太坊中的全域性屬性
- angular中定義全域性變數及全域性變數的使用Angular變數
- 在vue專案中 如何定義全域性變數 全域性函式Vue變數函式
- 使用 SAP Business Application Studio 開發 Vue 應用APPVue