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
@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 全局利用》