前言

我学习移动应用开发的时候,发现有教程要--新建MyApplication 继承Application,重写onCreate方法。

搜索完才知道,每个App里面都有一个Application,但是我们为什么还要自定义一个Application类呢?我们知道当App启动的时候,系统会自动加载并初始化Application类。Google 并不希望我们去自定义Application类。基本上只有需要做一些全局初始化的时候可能才需要用到自定义Application。

于是,想记录一下学习博客

目录

        定义

        特点

        方法介绍

        应用场景

        具体用法

        总结


定义

在Android中,Application类是所有Android应用程序的基类,也属于Android中的一个系统组件

继承关系:继承自 ContextWarpper

Android Studio中把每个类的方法视图显示出来 android studio 类_初始化

特点

实例创建方式:单例模式

每个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值越高,表示内存不足的严重性越高。

Android Studio中把每个类的方法视图显示出来 android studio 类_Android_02

具体使用:

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类,可以简化应用程序的结构、提高代码的可维护性和可重用性,同时优化应用程序的性能和用户体验。