前言
我学习移动应用开发的时候,发现有教程要--新建MyApplication 继承Application,重写onCreate方法。
搜索完才知道,每个App里面都有一个Application,但是我们为什么还要自定义一个Application类呢?我们知道当App启动的时候,系统会自动加载并初始化Application类。Google 并不希望我们去自定义Application类。基本上只有需要做一些全局初始化的时候可能才需要用到自定义Application。
于是,想记录一下学习博客
目录
定义
特点
方法介绍
应用场景
具体用法
总结
定义
在Android中,
Application
类是所有Android应用程序的基类,也属于Android
中的一个系统组件继承关系:继承自
ContextWarpper
类
特点
实例创建方式:单例模式
每个
Android App
运行时,会首先自动创建Application
类并实例化Application
对象,且只有一个 即Application
类 是单例模式(singleton
)类也可通过 继承
Application
类自定义Application
类和实例
实例形式:全局实例
即不同的组件(如
Activity、Service
)都可获得Application
对象且都是同一个对象
生命周期:等于 Android App 的生命周期
Application
对象的生命周期是整个程序中最长的,即等于Android App
的生命周期
方法介绍
attachBaseContext()
调用时刻:
在 Android 应用启动时,系统会首先调用 Application 的
attachBaseContext
方法。
作用:
attachBaseContext
方法主要用于进行一些初始化操作,这些操作通常不依赖于具体的 Context 对象。在这个方法中,你可以进行一些简单的操作,比如获取包名、设置一些全局变量等。此外,你还可以将传入的 Context 对象保存到 Application 对象中,方便全局使用。如果需要,你还可以在attachBaseContext
方法中创建一个自定义的ContextWrapper
对象,并将传入的 Context 对象作为参数传给它。
与 onCreate 的关系:
在 Android Application 的生命周期中,
attachBaseContext
方法的执行顺序是先于onCreate
方法的。这意味着,当你需要在应用程序启动时执行一些初始化操作时,你通常会首先在attachBaseContext
中进行一些基本的、不依赖于具体 Context 的设置,然后在onCreate
中进行更复杂的、可能需要具体 Context 的初始化操作。
具体使用:
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
String packageName = base.getPackageName(); // 获取包名
// 设置全局变量或其他简单操作
}
@Override
public void onCreate() {
super.onCreate();
// 在这里进行耗时的初始化操作,比如加载网络数据、初始化数据库等
}
}
onCreate()
调用时刻:
当Application对象被创建时调用。
作用:
注:不宜执行耗时操作,以免影响到第一个Activity或Service的启动速度。
通常用于初始化一些全局资源或第三方框架。
具体使用:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.d("TAG", "onCreate: "+getPackageName()); // 打印获取包名
}
}
onConfigurationChanged()
调用时刻:
当设备的配置信息(如屏幕方向、键盘可用性等)发生改变时调用。
作用:
监听 应用程序 配置信息的改变,如屏幕旋转等。
具体使用:
public class MyApplication extends Application {
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 检查新的屏幕方向
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 屏幕现在是横向的
// 这里可以调整UI布局或执行其他操作以适应横向模式
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
// 屏幕现在是纵向的
// 这里可以调整UI布局或执行其他操作以适应纵向模式
}
// 检查键盘是否可用
if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
// 键盘现在被隐藏了
} else if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {
// 键盘现在是可见的
}
// 处理其他配置变化...
}
}
首先,在你的 AndroidManifest.xml 中为某个 Activity 设置
android:configChanges
属性:
<activity android:name=".MainActivity">
android:configChanges="keyboardHidden|orientation|screenSize"
// 设置该配置属性会使 Activity在配置改变时不重启,只执行onConfigurationChanged()
// 上述语句表明,设置该配置属性可使 Activity 在屏幕旋转时不重启
</activity>
onLowMemory()
调用时刻:
当系统内存不足时调用。
作用:
注:
onLowMemory()
方法是在 Android 4.0 之前的主要内存释放机制。在 Android 4.0 及之后的版本中,虽然onLowMemory()
仍然可用,但系统提供了更精细的内存管理回调方法onTrimMemory(int level)
。在这个方法中,应用程序应该释放一些不再需要的资源,以减轻系统的内存压力。
具体使用:
public class MyApplication extends Application {
@Override
public void onLowMemory() {
super.onLowMemory();
}
}
onTrimMemory()
调用时刻:
通知 应用程序 当前内存使用情况(以内存级别进行识别)
作用:
根据level参数的值,应用程序可以决定释放哪些资源。level值越高,表示内存不足的严重性越高。
具体使用:
public class MyApplication extends Application
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {
}
}
}
应用场景
从Applicaiton
类的方法可以看出,Applicaiton
类的应用场景有:(已按优先级排序)
- 初始化 应用程序级别 的资源,如全局对象、环境配置变量等
- 数据共享、数据缓存,如设置全局共享变量、方法等
- 获取应用程序当前的内存使用情况,及时释放资源,从而避免被系统杀死
- 监听 应用程序 配置信息的改变,如屏幕旋转等
具体用法
继承 Application
类
在Manifest.xml
文件中 <application>
标签里进行配置
<application
android:name=".MyApplication"
// 此处自定义Application子类的名字 = MyApplication
...
</application>
总结
Android Application在Android应用程序中扮演着重要的角色,它提供了全局状态管理、生命周期管理和组件间数据共享的能力。通过合理地使用Application类,可以简化应用程序的结构、提高代码的可维护性和可重用性,同时优化应用程序的性能和用户体验。