编辑
2020-12-07
客户端技术
00
请注意,本文编写于 1021 天前,最后修改于 105 天前,其中某些信息可能已经过时。

目录

自定义Application
Application对象生命周期
Application对象的作用
Application对象 VS 静态单例

Application是维护应用全局状态的基类,Android系统会在启动应用进程时创建一个对应的Application对象。所以当我们需要创建全局变量的时候,不需要再像Java那样需要创建public权限的static变量,而直接在Application中去实现。其他组件只需要调用Context的getApplicationContext或者getApplication(在Activity中)来获得一个Application对象,再做出相应的处理。

自定义Application

我们可以通过创建一个子类,并在AndroidManifest.xml的<application>标签中将该子类的标准名称指定为"android:name" 属性来设定为自己的实现类。

java
public class MyApplication extends Application { // ... }

AndroidManifest.xml:

java
<?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

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线程。

java
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对象为例:

groovy
implementation group: 'com.squareup', name: 'otto', version: '1.3.8'

这是使用Application对象进行全局共享的示例:

MyApplication.java

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

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

java
public class BusProvider { private BusProvider(){} private static final Bus bus = new Bus(); public static Bus getBus(){ return bus; } }

OtherActivity.java

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

本文作者:Tim

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!