Android 技能图谱学习路线系列-Android基础之Application生命周期

一、Application的定义
1、继承关系如下:
Object <- Context <- ContextWrapper <- Application <- CustomApplication(自定义)
每个应用都会定义自己的CustomApplication,用于在启动的时候初始化一些资源,监听App的各种状态,做出相应的处理,如:锁屏,进入后台,横竖屏切换等
2、Application的特点:
单例模式创建:每个应用启动时,首先会创建Application对象,并且实例化该对象,Application对象只有一个,全局通用。
生命周期:Application的生命周期与整个App的生命周期相同。

二、Application的作用
1、初始化资源
App启动时会在Application的onCreate()方法中初始化一些全局资源,系统配置,三方sdk等。
此处需要注意一点,App可能会有多个进程:主进程、三方sdk的一些进程,初始sdk的时候需要注意在相应的进程中去初始化,避免浪费资源。

/**
     * 获取进程名称
     */
    public static String getProcessName(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
        if (runningApps == null) {
            return null;
        }
        for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) {
            if (proInfo.pid == android.os.Process.myPid()) {
                if (proInfo.processName != null) {
                    return proInfo.processName;
                }
            }
        }
        return "";
    }

上面的方法可以获取当前进程名称,App主进程的名称是应用的包名。
2、数据共享
由于Application对象是全局唯一的,所以可以用来缓存一些全局变量,这些变量在任何地方都可以调用,达到共享目的。
3、监听App所处状态
锁屏开屏,退到后台回到前台,手机内存状态,横竖屏切换,Activity的生命周期,退出应用(不稳定),这些都可以通过Application监听。

三、Application的生命周期
1、onCreate()
程序创建的时候执行,该方法同Activity的onCreate()方法类似,在应用启动的时候会调用,可以在里面初始化系统资源和一些三方sdk

2、onTerminate() 程序终止的时候执行

在App关闭的时候会调用,功能类似于onDestroy,但不保证一定会被调用,所以最好不要在该方法中做重要处理,该方法多用来销毁一些对象,清理一些缓存,但也不保证一定能清掉。如果想在程序结束时保存数据,不能用该方法。

3、onLowMemory()和onTrimMemory(int level)
这两个方法作用基本相同,Android4.0之前只能用onLowMemory方法,而从4.0开始,onTrimMemory就替代了onLowMemory方法。
它们的作用是,检测到手机内存不足,为了防止App被杀掉,可以通过该方法来释放一些资源降低内存。
现在主要分析onTrimMemory(int level)方法,该方法中有个参数level,有几个对应的枚举值:

TRIM_MEMORY_RUNNING_MODERATE:程序处于前台正常运行,不会被杀掉,但内存有点低,系统开始kill后台的其他进程。

TRIM_MEMORY_RUNNING_LOW:程序处于前台正常运行,但当前内存非常低,请释放不必要的资源,不然会影响App响应速度。

TRIM_MEMORY_RUNNING_CRITICAL:程序处于前台正常运行,大部分后台进程已经被杀死,请释放不必要的资源。

TRIM_MEMORY_UI_HIDDEN:应用从前台切换到后台,回收ui资源

TRIM_MEMORY_BACKGROUND:应用在后台运行,处于LRU缓存列表的最近位置,被回收的优先级比较低,可以释放一些资源,让应用在后台存活更长时间。

TRIM_MEMORY_MODERATE:应用在后台运行,处于LRU缓存列表的中间位置,如果资源得不到释放,有被系统回收的可能。

TRIM_MEMORY_COMPLETE:应用处于后台,处于LRU列表的边缘位置,系统内存严重不足,随时可能被回收,此时尽可能释放掉一切可释放的资源。
上面7个枚举从上到下,越来越容易被系统杀死,回收资源。

4、onConfigurationChanged(Configuration newConfig) 配置改变时触发这个方法。

5、监听activity的生命周期的方法
registerActivityLifecycleCallbacks(),
通过该方法可以监听所有Activity的生命周期方法,可以做一些公共处理,例如启动Activity的时候上报一些信息,也可以获取到当前Activity。该方法对应的取消方法是unregisterActivityLifecycleCallbacks

四、application 被杀死的情况分析:
为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个”重 要程度层次”.
其重要的程度按以下规则排序:
1、前端进程
前端进程可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume方法被调用时),
也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程.
在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程.

这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应.
2、可视进程
可视进程是持有一个被用户可见, 但没有显示在最前端 (onPause方法被调用时) 的Activity的进程.
举例来说, 这种进程通常出现在一个前端Activity以一个对话框出现并保持前一个Activity可见时.
这种进程被系统认为是极其重要的, 并且通常不会被杀掉, 除非为了保持所有前端进程正常运行不得不杀掉这些 可见进程.
3、服务进程
服务进程是持有一个Service的进程, 该Service是由startService()方法启动的, 尽管这些进程用户不能直接看到,
但是通常他们做的工作用户是十分关注的(例如, 在后台播放mp3或是在后台下载上传文件), 所以, 除非为了保 持所有的前端进程和可视进程正常运行外,系统是不会杀掉服务进程的.
4、后台进程
后台进程是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程. 这些进程不会直接影响用户体验. 加入这些进程已经完整的,正确的完成了自己的生命周期(访问Activity查看更多细节), 系统会在为前三种进程释 放内存时随时杀掉这些后台进程. 通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以 保证在低内存的时候, 最近 一个被用户看到的进程会被最后杀掉.
5、空进程
空进程是没有持有任何活动应用组件的进程. 保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下 次运行时的启动时间. 就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值