Application是保护利用全局状态的基类,Android零碎会在启动利用过程时创立一个对应的Application对象。所以当咱们须要创立全局变量的时候,不须要再像Java那样须要创立public权限的static变量,而间接在Application中去实现。其余组件只须要调用Context的getApplicationContext或者getApplication(在Activity中)来取得一个Application对象,再做出相应的解决。

<!-- more -->

自定义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

@Overrideprotected 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

@Overrideprotected void onResume() {    super.onResume();    MyApplication application = (MyApplication) getApplication();    Bus bus = application.getBus();    bus.register(this);}@Overrideprotected 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

@Overrideprotected void onResume() {    super.onResume();    BusProvider.getBus().register(this);    Log.i(TAG, "onResume: bus = " + BusProvider.getBus());}@Overrideprotected 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全局利用》