最近的开发中经常使用到 Application 类,它的用处很多,但是网上的资料有很多是旧的或者是介绍不全的,在这里全面总结一下,先介绍 Application 的所有方法,再介绍它的使用经验。
本文基于 Android6.0 源码,API LEVEL 23。
首先看看官网的介绍: 下面是我对 Application 类的理解:
就行了。然而,Application 类的作用可不单单是实现一个全局的单例,还有其他的很多功能,下面一一介绍。
- Context.getApplicationContext()
首先看看类结构: Application 是继承自 ContextWarpper 的,继承来的方法就不在这里说了,下面来看看 Application 的方法:
在 Application 创建的时候调用,一般用于初始化一些东西,如全局的对象,环境的配置等。
重写此方法可以监听 APP 一些配置信息的改变事件(如屏幕旋转等),当配置信息改变的时候会调用这个方法。在 Manifest 文件下的 Activity 标签(注意是 Activity)里配置
属性相应的配置属性,会使 Activity 在配置改变时候不会重启,只会执行 onConfigurationChanged() 方法。如:
- android:configChanges
属性可以使 Activity 旋转时不重启。
- android:configChanges="keyboardHidden|orientation|screenSize"
重写此方法可以监听 Android 系统整体内存较低时候的事件。按我的理解就是,当 APP 处于前台时,但是所有后台程序都被 kill 光了,但是还是内存不足时,系统就会调用这个方法告诉 APP,兄弟轮到你了。我们可以在这个方法里面释放一些不重要的资源,来保证到时候内存足够而让 APP 进程不被系统杀掉,或者提醒用户清一下垃圾,让内存清一点空位出来,我的手机老是这样提示我,不知道是不是这个方法惹的祸。
这个方法是一个比较难理解的方法,Trim 意思是修剪,按我的理解,用这个方法打个比方: 从前有个伟大的妈妈叫 Android 系统,她有一群子女叫 APP,她含辛茹苦地养着这群熊孩子。当系统老妈发现她的工资(内存)不够下个月的开销的时候,就会回调这个方法,告诉她的 APP 子女,我现在工资不够了,你们赶紧少吃少用点,不然我就要根据你们的重要性高低来一个一个地 "清理门户" 了。 这里有传入一个 int 类型的参数 level,它告诉 APP 们内存不足的严重性(越高越严重)。假如这时候系统内存不足,运行着前台和后台一共几个 APP,这些不同的 APP 会收到系统老妈不同的 "劝告信息":
这个方法在程序结束的时候会调用。但是这个方法只用于 Android 仿真机测试的时候,在 Android 产品机是不会调用的。所以这个方法并没什么用。
这两个方法用于注册或者注销对 APP 内所有 Activity 的生命周期监听,当 APP 内 Activity 的生命周期发生变化的时候就会调用 ActivityLifecycleCallbacks 里面的方法:
- registerActivityLifecycleCallbacks(newActivityLifecycleCallbacks() {@Override
- public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
- Log.d(TAG,"onActivityCreated: "+ activity.getLocalClassName());
- }@Override
- public void onActivityStarted(Activity activity) {
- Log.d(TAG,"onActivityStarted: "+ activity.getLocalClassName());
- }@Override
- public void onActivityResumed(Activity activity) {
- Log.d(TAG,"onActivityResumed: "+ activity.getLocalClassName());
- }@Override
- public void onActivityPaused(Activity activity) {
- Log.d(TAG,"onActivityPaused: "+ activity.getLocalClassName());
- }@Override
- public void onActivityStopped(Activity activity) {
- Log.d(TAG,"onActivityStopped: "+ activity.getLocalClassName());
- }@Override
- public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
- }@Override
- public void onActivityDestroyed(Activity activity) {
- Log.d(TAG,"onActivityDestroyed: "+ activity.getLocalClassName());
- }
- });
我们来测试一下,把 APP 切到后台再打开,log 结果是:
- onActivityPaused:MainActivity
- onActivityStopped:MainActivity
- onActivityStarted:MainActivity
- onActivityResumed:MainActivity
用于注册和注销 ComponentCallbacks2 回调接口,里面的方法前面已经介绍过,看名字就知道:
- registerComponentCallbacks(newComponentCallbacks2() {@Override
- public void onTrimMemory(intlevel) {
- }@Override
- public void onConfigurationChanged(Configuration newConfig) {
- }@Override
- public void onLowMemory() {
- }
- });
Context 类也有这两个方法,但是 Context 类的方法只可以使用 ComponentCallbacks,比 Application 少了一个 onTrimMemory() 回调。
API18 以上的方法,网上关于这两个方法的介绍很少,几乎没有,在官网上的介绍是这样的:
This is called when the user is requesting an assist, to build a full ACTION_ASSIST Intent with all of the context of the current application.
好像是当用户请求帮助的时候会调用这个方法,然后会启动一个 ACTION_ASSIST 的 Intent。什么时候才是用户请求帮助呢? StackOverflow 里有的人说是长按 Home 键,外国的机子会跳出 Google Now 这个助手,至于国内的机子,我用我自己的华为荣耀 6P 长按 Home 键是弹出语音助手,但是没有回调这个方法。然后尝试了一下用下面的代码来发送一个 ACTION_ASSIST 来看看有什么效果:
- Intent intent =newIntent(ACTION_ASSIST);context.startActivity(intent);
结果打开了我手机上 UC 浏览器的语音搜索功能。。。 最后还是搞不懂这个方法什么时候会回调,如果有知道的请告知,谢谢!
要使用自定义的 Application,首先就是要自己新建一个 Application 的子类,然后把它的名字写在 manifest 文件里面的 application 标签里的 android:name 属性就行,如我的 Application 子类名字是 BaseApplication,则:
- android:name=".BaseApplication"
由于 Application 类是在 APP 启动的时候就启动,启动在所有 Activity 之前,所以可以使用它做资源的初始化操作,如图片资源初始化,webView 的预加载,推送服务的注册等等,注意不要执行耗时操作,会拖慢 APP 启动速度。
以上就是我对 Android 中 Application 的总结和使用经验,基于 Android6.0 的 API,所有的方法都是经过实测的,如有错漏,敬请指正,谢谢!
https://developer.android.com/reference/android/app/Application.html http://blog.csdn.net/man_embedded/article/details/52625619 http://androidperformance.com/2015/07/20/Android-Performance-Memory-onTrimMemory.html http://blog.csdn.net/android_jianbo/article/details/46228003
来源: http://blog.csdn.net/totond/article/details/72782031