Android中的Application类

一、Application是什么

Application同Activity、Service一样,都是Android系统的组件。当应用程序启动过程中,最先创建的是Application实例(有且仅有一个),它的创建早于应用程序启动以及任何Activity、Service或接收者对象(不包括ContentProvider)的创建。Application的生命周期是整个应用程序中最长的,它的生命周期就等于应用程序的生命周期。

Android中Application的创建流程(gal2xy.github.io)一文中,应用程序启动会创建主线程ActivityThread,然后通过AMS的attachApplication()方法绑定Application(深入该方法会有一系列调用,这里只简单描述),最终会创建Application,并赋值给刚刚创建的ActivityThread的mInitialApplication 字段,因此这个Application是全局的且单例的,而所有的Activity、Service等组件受ActivityThread的管理,所以在不同的Activity、Service中获得的Application对象都是一样的,因此可以通过Application来进行一些操作,如数据传递、数据共享和数据缓存等。

Application的形象示意图如下:

二、Application类的一些方法

  • getProcessName()

    获取当前进程的名称。

  • onConfigurationChanged()

    监听app的配置信息改变事件,如手机屏幕旋转等。当配置信息发生变化时被调用。

  • onCreate()

    Application初始化时被调用,调用时机早于任何一个Activity、Service。

  • onLowmemory()

    监听系统内存情况,当系统内存不足时调用该方法来释放一些不重要的资源,以保证app能够继续运行而不被系统杀掉。

  • onTerminate()

    应用程序结束时被调用,通常用于模拟过程环境中。

  • onTrimMemory():

    通知应用的不同内存情况。

  • registerActivityLifecycleCallbacks()和unregisterActivityLifecycleCallbacks()

    注册或者注销对APP内所有Activity的生命周期监听,当app内Activity的生命周期发生变化的时候就会调用ActivityLifecycleCallbacks里面的方法。

  • registerComponentCallbacks()和unregisterComponentCallbacks()

    用于注册和注销ComponentCallbacks或ComponentCallbacks2回调接口。

三、Application的应用

Application 作为整个 App 的一个单例对象,其作用如下:

  1. 作为 App 的入口,可用来初始化基本配置,如第三方 SDK 的初始化。
  2. 可以在 Application 中定义供全局使用的变量,不过当应用被强杀之后有可能出现空指针的问题,导致再次打开应用的时候崩溃,如果确定要这样使用,一定要处理好这种情况。
  3. 可以借助 Application 管理 Activity 的生命周期状态以及判断应用处于前台还是后台等,可根据内存优先级降低自身应用所占内存,减小自身应用被系统强杀的可能性。

3.1 自定义Application

在开发中,我们通常不需要手动实现应用的Application,系统会自动帮我们创建。如果需要自定义Application,那么只需要创建一个类继承Application并在AndroidManifest.xml文件中使用<application/>标签进行注册即可(name属性指定Application的全限定类名)。

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.shellapk;

import android.app.Application;

public class ProxyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//可以进行一些全局配置

}
}

主要重写里面的onCreate()方法(Application的onCreate()才是真正的Android程序的入口点),可以在里里面初始化一些全局变量,然后在整个应用中的各个文件中就可以对这些变量进行操作了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 全局唯一,删除默认的application -->
<!-- <application-->
<!-- android:allowBackup="true"-->
<!-- android:dataExtractionRules="@xml/data_extraction_rules"-->
<!-- android:fullBackupContent="@xml/backup_rules"-->
<!-- android:icon="@mipmap/ic_launcher"-->
<!-- android:label="@string/app_name"-->
<!-- android:roundIcon="@mipmap/ic_launcher_round"-->
<!-- android:supportsRtl="true"-->
<!-- android:theme="@style/Theme.ShellApk"-->
<!-- tools:targetApi="31" />-->
<!-- 注册自己自定义的application -->
<application android:name="com.example.shellapk.ProxyApplication"></application>
</manifest>

四、总结

Application是Android系统中的一个组件,它是最先创建的(早于任何一个Activity、Service等组件),因而是整个应用程序的入口点,同时也是一个全局的上下文环境,在这个Application类中可以访问和管理应用程序中的其他组件,即与其他组件之间有特定的交互逻辑和数据共享机制。(我似乎已经明白了为什么壳程序里面需要替换掉已有的Application实例为源程序的Application,因为Application可以认为是整个应用程序的抽象,如果不替换掉壳程序的Application,即使通过DexClassLoader加载源程序APK,仍会无法正常运行)


参考:

https://guides.codepath.com/android/Understanding-the-Android-Application-Class

https://developer.android.com/reference/android/app/Application

Android-Application详解 - 简书 (jianshu.com)

Android组件化之Application - 知乎 (zhihu.com)


Android中的Application类
http://example.com/2023/12/01/Android安全/Android中的Application类/
作者
gla2xy
发布于
2023年12月1日
许可协议