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 的一个单例对象,其作用如下:
- 作为 App 的入口,可用来初始化基本配置,如第三方 SDK 的初始化。
- 可以在 Application 中定义供全局使用的变量,不过当应用被强杀之后有可能出现空指针的问题,导致再次打开应用的时候崩溃,如果确定要这样使用,一定要处理好这种情况。
- 可以借助 Application 管理 Activity 的生命周期状态以及判断应用处于前台还是后台等,可根据内存优先级降低自身应用所占内存,减小自身应用被系统强杀的可能性。
3.1 自定义Application
在开发中,我们通常不需要手动实现应用的Application,系统会自动帮我们创建。如果需要自定义Application,那么只需要创建一个类继承Application并在AndroidManifest.xml文件中使用<application/>
标签进行注册即可(name属性指定Application的全限定类名)。
1 |
|
主要重写里面的onCreate()
方法(Application的onCreate()
才是真正的Android程序的入口点),可以在里里面初始化一些全局变量,然后在整个应用中的各个文件中就可以对这些变量进行操作了。
1 |
|
四、总结
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