位置: 编程技术 - 正文

Android应用常规开发技巧——善用组件生命周期(android应用结构包括哪些)

编辑:rootadmin

推荐整理分享Android应用常规开发技巧——善用组件生命周期(android应用结构包括哪些),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android应用程序由哪些部分构成,他们间的关系是什么,android应用基础教程,android应用程序结构有哪些,android应用程序的主要语言是java,android应用结构包括哪些,android应用结构包括哪些,android应用程序主要包含,android应用结构包括哪些,内容如对您有帮助,希望把文章链接给更多的朋友!

数据管理 对于只读数据,一种常用的管理模式是在onCreate函数中进行数据的加载,直到组件的onDestory函数被调用时在进行释放。

如果数据支持读写操作,则需要在onResume或者onCreate中进行读取,而在onPause中实现存储。 因为当onPause函数被调用后,该界面组件就处于可回收的状态。当资源紧张时,系统会强行销毁组件对象。 对象中所有未持久化的修改就会丢失。对于读写数据处理的模型示例如下:

状态管理

当系统将界面组件切离前台状态(即onPause函数调用前),会先行调用onSavaInstanceState函数。在该函数中,开发者可以讲组件中的状态数据写入参数的outState对象中。outState的对象类型是Bundle,他是通过键值对的方式进行数据的存储。

onCreate —— 如果含有state数据,则先调用onRestoreInstanceState。 onRestoreInstanceState —— 组件进入前台状态前,先调用恢复数据。 onSaveInstanceState —— 组件离开前台状态,先调用状态保存数据,在调用onPause。如果用户是主动离开前台状态,则不会触发该状态。

当前onSaveInstanceState函数调用完成后,存储状态信息的outState对象中的数据就由系统进程代为保管,不论该应用进程是否被系统回收,这些数据都不会丢失。

如果savedInstanceState为空,说明这是一次全新的构造,反之则说明这是一次恢复性的构造。界面组件可以利用该参数中的信息将界面状态恢复到系统回收前的状态。

区分是恢复性构造还是全新的狗仔,是开发中需要妥善处理的细节。如果是全新的构造,界面组件中需要分析调用发送的Intent对象,控制业务流程;而如果是恢复性构造,则需要将上次缓存的信息一一恢复。

为了降低开发者的负担,Android中的大部分的系统控件都实现了状态缓存的逻辑。在onSaveInstanceState函数调用前,界面组件会遍历整个控件树,将各个控件保存下来。等到onRestoreInstanceState函数被调用时在进行恢复。

如果系统内置的控件状态缓存逻辑不符合开发者的需求,开发者可以调用View.setSaveEnabled函数关闭对应控件对象的自动缓存,在onSaveInstanceState函数中自行管理控件的状态。

用于状态管理的onSaveInstanceState 和 onRestoreInstanceState并不属于基本的生命周期函数,但是状态管理的操作还是和组件的生命周期有必然的联系,开发者同样需要妥善利用好这些函数,处理由于生命周期变更引起的变化。

注册管理 界面组件在于用户交互的过程中有时候需要随着系统状态的变化及时的更新信息。比如地址信息。

界面组件可以通过监听相关的事件信息来捕获这些变化。如果所监听的事件的变化,仅当组件在前台状态时才需要生效(比如广播事件的监听,地理位置的变更等),则需要早onResume中注册,在onPause中注销。

线程管理

在应用开发中,网络通信、数据操作、复杂计算等都需要耗费大量的时间,因此应用通常需要采用多线程的设计模式,在后台线程中执行此类耗时的操作。

Android的组件生命周期,是一个典型的同步处理逻辑。对于多线程架构没有提供良好的支持模型。这个需要开发者根据自己的需求,充分利用好组件的生命周期,合理的安排线程的构造及销毁。

如果线程的生命周期和该组件的生命周期紧密联系,就需要在界面组件生命周期中管理该线程,一旦线程被界面组件构造出来,就需要在onDestory中明确终止该线程,回收其线程空间。否则,将导致线程资源泄漏。 但是仅在onDestory回收线程依然不够完美,因为在资源紧张的情况下,系统会强行回收组件,此时组件的onDestory函数可能并没有调用,从而导致线程资源泄漏。

一个更好的线程管理方案,是将线程的句柄信息当做界面组件的状态信息缓存下来。如果系统强行回收该对象组件,则需要在组件再次被构造时,根据缓存的线程句柄找到该线程,从而避免线程泄露。

static final String THREAD_WORKER_ID = “thread_id”; Thread workerThread;

服务组件的生命周期

Android应用常规开发技巧——善用组件生命周期(android应用结构包括哪些)

服务的使用方式可分为两种,分别是调用服务和绑定服务。这两种不同的使用方式下,生命周期略微有不同。 但不论在何种使用模式下,组件的生命周期都是从onCreate中开始,至onDestory中结束。因为服务组件开发中,可以选择在onCreate中做数据加载等初始化工作,而在onDestory中做数据销毁,线程终止等清理工作。

在绑定模式下,onBind函数被调用时,说明服务以及被前台界面组件绑定。服务组件应根据调用者传递的Intent对象,在该函数内加载资源,构建通信对象,等待绑定者的调用。当界面组件完成相关操作时,需会解除与服务组件的绑定。此时,onUnBind函数会被调用,可以在该函数中做一些统计和资源清理工作。

被绑定服务组件的进程状态,与绑定该服务的界面组件密切相关。如果绑定组件为前台界面组件,则改服务所处的进程即为前台进程。反之也相同。

Android系统不会轻易回收前台进程或者可视进程,所以出于绑定状态的组件通常也不会被强制停止。对于开发者而言,绑定服务后一定不要忘记选择在合适的时机接触绑定,否则将使服务组件停留在前台或可视状态无法回收,从而浪费系统资源。

在调用模式,当服务组件执行onStartCommand函数时,服务所在的进程为前台进程,拥有最高的优先级。当onStartCommand函数执行完成后,如果没有显示的调用stopSelf等相关函数来停止服务组件,那么该服务组件将会成为后台组件继续提供服务,直至调用stopSelf函数停止,或者等待系统强行回收。

onStartCommand函数中增加三个返回值和控制参数,用于指定后台服务组件的运行方式,其中最重要的返回值有三个:

START_STICKY —— 系统会对该服务组件负责到底,在强行回收该组件后后,在资源宽裕的时候还会调用onStartCommand函数重新启动该服务。直到调用stopSelf函数。对于开发者而言,编写返回值为START_STRICKY,一定要在合适的时机调用stopSelf函数主动关闭服务,否则会无限期的消耗系统资源。

START_NOT_SRICKY —— 说明系统可以无条件的回收该组件,而无需关注服务是否完成,也不需要负责服务的重新启动。

START_REDELIVER_INTENT —— 则意味着需要保障该服务组件能够完整的处理完每一个Intent对象。

触发器组件的生命周期:

触发器的生命周期是最短暂的,其整个生命周期就是构造触发器对象,然后执行onReceive函数。对于执行完onReceive函数,系统会立即出发销毁触发器的组件对象,回收其占用的资源。

生命周期内,onReceive函数内部不能够处理耗时任务。

数据源组件的生命周期

理论上来说,数据源组件没有所谓的生命周期,因此数据源组件的状态不作为进程优先级的判断依据。所以系统在回收进程资源时,并不会将数据源的销毁事件告知开发者。

但Android会在构造数据源组件时调用onCreate函数。开发者可以在该函数中数据化数据源所需的数据库或者其他数据内容。

由此可知,在数据源组件中部署延迟写入等写优化策略是不合适,因为数据源组件可能会被系统静默回收,从而导致未持久化的写入数据丢失。所以在数据源组件的实现中,写优化策略应该交由上层调用去实现,或者下层数据存储者去处理。

一旦数据源组件构造出来,就会保持长期运行的状态直至其所在的进程被系统回收。所以不要再数据源组件中缓存过多的数据,以免占用内存空间。

观察者事件:

通常如果在onResume与onPause中,接收到观察者事件可以安全的执行后续观察者事项。尽量确保组件的观察者事件只处理当前界面处于前台状态下的事物,而可视状态甚至后台状态下的事物,不可以依赖观察者事件来处理。 因为观察者事件并不能确保在组件生命之间可达。观察者事件只应该在组件可见的生命周期内执行监听,其余的数据更新需要依赖于组件的生命周期方法。 比如onStart,onStop,onResume,onPause等。过度依赖于观察者事件,将导致将必要的功能与观察者事件耦合。

观察者事件的add和remove需要成对出现,否则会引发内存泄露。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android Juint环境配置 在Android程序开发中经常要用到Juint测试程序。1、在AndroidManifest.xml文件中加入代码在/application前加入内容:uses-libraryandroid:name=android.test.runner/在/manifest上

Android 编程下 SQLite 大数据量操作优化(插入操作) 转载地址:

ADB (Android Debug Bridge)常用命令 ADB(AndroidDebugBridge)说明:下面一些命令需要有root权限才能执行成功快速启动dos窗口执行adb:1.adb.exe所在路径添加到系统环境变量中2.配置快捷键启动dos进

标签: android应用结构包括哪些

本文链接地址:https://www.jiuchutong.com/biancheng/376515.html 转载请保留说明!

上一篇:android 测试单元 自动测试(android 测试工具)

下一篇:Android Juint环境配置(android studio环境)

  • 买房契税缴纳比例
  • 对公跨行转账汇款(非柜面)手续费单笔 9折
  • 减免增值税款怎么算
  • 借款现金分录怎么做
  • 小规模纳税人不能抵扣进项税额
  • 自然人个税申报换电脑数据怎么合并
  • 银行存款的会计处理方法
  • 不是单位职工个税怎么算
  • 公司车买的保险怎么查电子保单
  • 外购的材料用于在建工程进项税额
  • 有留抵税额会计分录
  • 合伙企业缴纳税款时间
  • 股票印花税怎么交
  • 印花税按什么税率
  • 个人所得税税费种认定功能在哪里
  • 企业股权溢价转让会计分录
  • 关于非上市公司的法律
  • 员工生日福利申请
  • 递延资产摊销属于什么科目
  • win7鼠标点右键没反应
  • 客户收集软件
  • 暂估入库入库单范本
  • 鸿蒙系统怎样开启5G
  • 松木山在哪
  • linux系统备份整个硬盘的命令
  • Win7系统电脑c盘什么都没有为什么满了
  • 上季度成本多结转了怎么调
  • mds是什么进程
  • 转租会计如何记账
  • php ssl
  • webpack--》webpack底层深入讲解,从初识到精通,真正实现从0到1的过程
  • php编程入门教程
  • 时间序列garch
  • 达摩院 2021
  • IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python
  • 可转债公允价值变动计入
  • 土地增值税可以抵扣吗
  • 出口未申报如何处理
  • Mysql数据库查询客户端
  • 小规模纳税人增值税专用发票税率
  • 公司收到个人汇款怎么开发票
  • 设置sql server的安全认证模式为混合认证模式
  • 营改增之后建筑业预收账款是否需要预交税款
  • 会计分录记录于什么中
  • 现金日记账余额自动生成公式
  • 销售商品发生的销售退回计入什么科目
  • 收到的承兑怎么转给别人
  • 端午节发放的现金福利会计处理
  • 查补以前年度所得税
  • 租的办公室装修费怎么处理
  • 提交免税申请
  • 小规模纳税人如何缴纳企业所得税
  • 实缴资本和注册资本的比例
  • mysql的性能调优
  • freebsd做服务器
  • 电脑重装win7系统黑屏
  • win8怎么打开系统设置
  • kb5003169安装失败
  • winxp系统和win7系统有什么区别
  • sgbhp.exe - sgbhp是什么进程 有什么用
  • linux创建vg
  • 保证windows 7安装后正常使用的安装方法
  • react-native fetch的具体使用方法
  • python爬虫入门教程非常详细
  • perl 读文件
  • Building Unity3D Plugins for Android
  • nodejs基本原理
  • 我吐槽你
  • CSS List Grid Layout 图片垂直居中
  • python中读取文件
  • unity人物换肤用什么方法
  • python搭建网站并在服务器上部署
  • javascript和html区别
  • python 判断中文字符
  • jquery.qtip提示信息插件用法简单实例
  • 深入python3
  • 我是一般纳税人对方给我开的普票
  • 2020年砂石
  • 吉林税务发票自动查询系统网
  • 佛山电动摩托车能上牌吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设