`
leiyongping88
  • 浏览: 77057 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android 运用程序的生命周期 浅谈

阅读更多
在多数情况下, 每个Android应用运行在自己的Linux进程中. 当一个应用的某段code需要运行的时候这个进程将会被创建, 直到不再需要该应用或系统要为其他的应用释放内存的时候才停止

一个非常重要且少有的特性是, 应用进程的存活时间不是由这个应用直接控制的. 而是由系统决定的, 系统会根据每个已知的正在运行的应用情况来定夺, 包括, 该应用对用户的重要性和系统全部可用内存.


对于开发人员来讲, 了解每个应用组件(尤其是, Activity, Service, 和IntentReceiver)对于应用进程存活时间的影响是非常重要的. 如果没有正确使用, 可能会导致应用进程在处理重要工作的时候被系统杀掉.


在对应用进程生命周期的理解中, 一个典型的错误就是当一个IntentReceiver 接收到Intent 之后, 会在自己的onReceiveIntent()方法中开起一个线程, 而后return这个方法. 一旦这个方法return, 系统会认为这个IntentReceiver 不在处于活跃状态, 也就认为他的宿主进程不再需要(除非还包有其他活跃的应用组件). 以至于当系统需要回收内存的时候会随时释kill掉这个进程, 中止其中的子线程. 解决这个问题的办法是在IntentReceiver中启动一个Service, 这样系统会知道在这个进程中还有活跃的任务需要完成.



为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个"重要程度层次". 其重要的程度按以下规则排序:

     

       1. 前端进程可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程 (onResume方法被调用时),也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程. 在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程. 这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应.

      

       1. 可视进程是持有一个被用户可见, 但没有显示在最前端 (onPause方法被调用时) 的Activity的进程. 举例来说, 这种进程通常出现在一个前端Activity以一个对话框出现并保持前一个Activity可见时. 这种进程被系统认为是极其重要的, 并且通常不会被杀掉, 除非为了保持所有前端进程正常运行不得不杀掉这些可见进程.

      

       1. 服务进程是持有一个Service的进程, 该Service是由startService()方法启动的, 尽管这些进程用户不能直接看到, 但是通常他们做的工作用户是十分关注的(例如, 在后台播放mp3或是在后台下载 上传文件), 所以, 除非为了保持所有的前端进程和可视进程正常运行外, 系统是不会杀掉服务进程的.

    

       1. 后台进程是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程. 这些进程不会直接影响用户体验. 加入这些进程已经完整的,正确的完成了自己的生命周期(访问Activity查看更多细节), 系统会在为前三种进程释放内存时随时杀掉这些后台进程. 通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以保证在低内存的时候, 最近一个被用户看到的进程会被最后杀掉.

      

       1. 空进程是没有持有任何活动应用组件的进程. 保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下次运行时的启动时间. 就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源.


当需要给一个进程分类的时候, 系统会在该进程中处于活动状态的所有组件里掉选一个重要等级最高作为分类依据. 查看Activity, Service,和IntentReceiver的文档, 了解每个组件在进程整个生命周期中的贡献. 每一个classes的文档详细描述他们在各自应用的生命周期中所起得作用.
分享到:
评论

相关推荐

    浅谈Android生命周期

    每个组件都有其特定的生命周期方法,开发者需要根据这些方法来编写代码,确保应用程序能够正确响应系统事件,如用户交互、设备屏幕状态改变等。 首先,我们聚焦于Activity的生命周期。Activity是Android应用的核心...

    浅谈Android的Activity运行流程(生命周期)

    ### 浅谈Android的Activity运行流程(生命周期) #### 概述 在Android开发中,`Activity`是四大组件之一,负责处理与用户交互相关的界面显示。每个`Activity`都有其特定的生命周期,这一周期决定了应用如何响应...

    Android框架浅谈

    6. **Activity的生命周期管理**:Activity是Android应用程序的基本单元,每个Activity都有自己的生命周期,从创建到销毁经历了一系列的状态变化。当Activity被启动时,系统会根据Intent的属性值决定是复用已有的Task...

    浅谈Android移动开发程序员的职业发展之路

    ### 浅谈Android移动开发程序员的职业发展之路 随着信息技术的快速发展与智能手机的普及,移动应用开发成为了一个备受关注的领域,而Android作为全球最大的移动操作系统之一,其开发人员的需求量也在逐年攀升。本文...

    浅谈Android Service服务的高级技巧

    Android Service 服务是 Android 应用程序开发中不可或缺的一部分,本文将主要介绍浅谈 Android 服务的高级技巧。 前台服务是 Android 服务的一种,它可以在系统状态栏中显示一个图标,并且可以在状态栏中显示更多...

    浅谈Android中关于静态变量(static)的使用问题

    在Android开发中,静态变量(`static`)的使用是一个重要的议题,因为它涉及到应用程序的内存管理、生命周期以及可能引发的问题。下面将详细讨论以下几个方面: 1. **静态变量的生命周期**: - 静态变量在类被加载...

    【菜鸟谈android】(二) android基本概念及处理过程

    这篇“【菜鸟谈android】(二) android基本概念及处理过程”可能会深入浅出地介绍Android开发的一些核心要素。虽然没有具体的描述内容,但从标题我们可以推测文章可能涵盖了以下几个方面: 1. **Android系统架构**:...

    Android学习之浅谈对MVC模式和MVP模式的理解

    MVC是一种软件设计模式,主要用于分离应用程序的业务逻辑(Model)、用户界面(View)和控制逻辑(Controller)。Model负责数据的处理和存储,View负责数据显示,而Controller作为桥梁,接收用户输入并调用Model进行...

    浅谈Android app开发中Fragment的Transaction操作

    在Android应用开发中,Fragment是构成界面的一个重要组件,...正确使用这些方法可以帮助构建高效且用户友好的应用程序。在实践中,开发者应根据具体需求灵活运用,同时注意避免可能导致内存泄漏或性能问题的常见陷阱。

    浅谈WebView.doc

    在Android开发中,WebView是一个非常重要的组件,它允许开发者在应用程序内部嵌入一个浏览器功能,以便用户可以直接在应用中浏览网页内容。WebView基于WebKit渲染引擎,提供了与浏览器类似的功能,如加载网页、执行...

    浅谈关于Android路由的实现

    Android路由是一种在应用程序中管理页面跳转和数据传递的机制,它能够帮助开发者更加灵活地控制应用的导航流程。本文将探讨如何实现Android路由,特别是在处理外部应用和Web跳转到我们应用的场景下。 1. **URL的...

    浅谈Android应用的内存优化及Handler的内存泄漏问题

    当应用程序尝试申请的Java Heap空间超过Dalvik VM的Heap Growth Limit时,就会发生OOM。这种情况并不意味着系统内存不足,而是应用请求的堆内存超过了限制。 Android系统为了应对内存不足的情况,采用了Memory ...

    2020年百度、阿里、腾讯、字节跳动Android高频面试题解析.pdf

    Android 知识点汇总可能涵盖 Activity、Service、BroadcastReceiver、ContentProvider 四大组件的生命周期和通信方式。UI 组件如 Layout、View、Adapter 也是面试常谈的话题。Android 开源库源码分析可以帮助理解...

    Android开发:浅谈MVP模式应用与内存泄漏问题解决

    MVP模式将应用程序分为三个主要组件:Model、View和Presenter。Model负责处理数据和业务逻辑,View负责显示用户界面,而Presenter作为中间人,协调Model和View之间的通信。 **MVP模式详解** 1. **Model**:Model层...

    浅谈SQLite数据库操作常用方法.docx

    同时,`SQLiteOpenHelper`类是管理SQLite数据库生命周期的重要工具,它处理数据库版本升级、创建和升级数据库结构等工作。 总之,SQLite为Android应用程序提供了高效且便捷的数据存储解决方案。通过熟练掌握上述...

    浅谈Android AsyncTask内存安全的一种使用方式

    在Android中,尤其是当Activity或Fragment实例被引用,但它们生命周期已结束时,就会发生内存泄漏。 AsyncTask的一个常见内存泄漏问题是,当Activity持有AsyncTask的强引用,即使Activity被销毁,由于AsyncTask仍在...

    浅谈Android 的线程和线程池的使用

    在Android开发中,线程和线程池的使用至关重要,因为它们可以帮助我们处理应用程序的多任务执行,确保UI线程不被阻塞,提供更好的用户体验。本文将详细讲解Android线程和线程池的基本概念、用途及具体实现方式。 ...

    浅谈信息时代产品创新之特征.pdf

    智能硬件、物联网设备以及各种AI应用程序成为产品创新的新领域。例如,智能家居产品、智能穿戴设备等,这些产品不仅提高了生活的便利性,还为企业创造了新的商业模式和增长点。 三、快速迭代与持续创新 在信息时代...

    防止内存溢出浅析

    本文将深入浅谈如何防止Android应用程序中的内存溢出。 首先,我们需要理解Android应用的内存管理机制。Android系统采用垃圾回收(Garbage Collection, GC)机制来自动释放不再使用的对象所占用的内存。当一个对象...

Global site tag (gtag.js) - Google Analytics