Android开发 Activity启动模式、ViewModel与LiveData,及Kotlin Coroutines

目录

Activity启动模式

onNewIntent解释

Activity启动模式的考虑时机

Service启动模式

ContentProvider的作用

Broadcast的注册方式

AsyncTask的作用

ViewModel

LiveData

Kotlin Coroutines

结合使用


Activity启动模式

Android中Activity的启动模式有四种,分别是:

  • standard(标准):每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在。
  • singleTop(栈顶复用):如果新的Activity已经位于任务栈的栈顶,那么这个Activity不会被重新创建,同时它的onNewIntent方法会被调用。如果Activity不在栈顶,还是会重新创建一个新的实例。
  • singleTask(栈内复用):系统先检查是否存在Activity的实例,如果存在就调用其onNewIntent方法,并把在它之上的所有其他Activity实例统统出栈,如果不存在,则新建实例。
  • singleInstance(单实例模式):在一个单独的任务栈中创建该Activity的实例,这个模式下的Activity只能单独地位于一个任务栈中。

onNewIntent解释

在Android开发中,onNewIntent(Intent)Activity的一个回调方法。当当前Activity启用了singleTopsingleTasksingleInstance启动模式,并且该Activity已经存在于任务栈中时,再次启动该Activity不会创建一个新的实例,而是会调用现有实例的onNewIntent(Intent)方法,并传入新的Intent。这个方法允许Activity更新其内容而不需要重新创建。

Activity启动模式的考虑时机

Activity启动模式的选择主要考虑以下几个方面:

  • 任务和返回栈管理:根据应用的结构和用户的导航需求,选择合适的启动模式以合理管理任务(App中的一系列Activity集合)和返回栈(用户返回路径)。
  • 避免重复实例:为了避免不必要的Activity实例堆积,可以选择合适的模式来复用Activity实例。
  • Intent处理:如果Activity需要处理新的Intent(如搜索请求),可能需要通过onNewIntent方法来更新Activity的显示内容而不是创建新的实例。

代码上,首先需要在AndroidManifest.xml中定义Activity的启动模式。比如设置MainActivity的启动模式为singleTop

<activity android:name=".MainActivity"android:launchMode="singleTop">
</activity>

然后,在MainActivity中重写onNewIntent方法:

class MainActivity : AppCompatActivity() {override fun onNewIntent(intent: Intent?) {super.onNewIntent(intent)}
}

Service启动模式

Service有两种启动方式:

  • startService:通过调用startService(Intent)来启动。Service将在后台无限期运行,即使启动它的组件已被销毁也如此。需要通过stopSelf()stopService(Intent)来停止Service。
  • bindService:通过调用bindService(Intent, ServiceConnection, int)来实现。Service与调用组件绑定,调用组件如果被销毁了,Service也会被销毁。

IntentService:是Service的子类,用于处理异步请求(执行在工作线程)。客户端通过startService(Intent)方法发送请求,该服务在每次处理完后自动停止,不需要手动停止。

ContentProvider的作用

ContentProvider提供了一种在不同应用程序间共享数据的方式。它可以封装数据,并对外提供统一的访问接口。是多线程和多进程安全的,但具体实现时需要考虑线程同步问题。

Broadcast的注册方式

BroadcastReceiver可以通过两种方式注册:

  • 在AndroidManifest.xml中静态注册。
  • 在代码中动态注册。

静态注册的BroadcastReceiver即使应用没有运行,也可以接收到广播。动态注册的BroadcastReceiver只有在其注册的上下文(通常是Activity或Service)存在时才能接收广播。

广播可以是有序的也可以是无序的。有序广播(ordered broadcasts)可以被接收者中断,即一个接收者可以阻止进一步传播。无序广播(normal broadcasts)则不能被中断,所有注册了的接收者都会接收到。

AsyncTask的作用

AsyncTask用于在后台线程中执行短暂的任务,并可以在主线程中更新UI。它简化了线程和Handler的使用。AsyncTask的主要方法包括:

  • doInBackground(Params...):后台执行的任务。
  • onPostExecute(Result):后台任务执行完后在主线程中执行。
  • onProgressUpdate(Progress...):更新进度信息。

从Android 4.0开始,AsyncTask默认在一个单线程池中串行执行任务,但也可以通过executeOnExecutor方法在多线程池中并行执行。

PS:由于AsyncTask容易导致内存泄漏和对生命周期的管理不便,它在Android开发中逐渐被其他现代的异步处理方案所取代,如使用LiveDataViewModel结合Kotlin Coroutines

ViewModel

ViewModel是一个负责为UI准备数据的类,它能够管理界面相关的数据,并且能够在配置改变(如屏幕旋转)后继续存在。ViewModel的目的是从UI控制器中分离出数据获取的逻辑,使得数据可以持久化。

LiveData

LiveData是一个可观察的数据存储器类,它遵循观察者模式。与普通的观察者不同,LiveData是生命周期感知的,意味着它尊重Android组件(如Activity、Fragment)的生命周期,确保只有在组件处于活跃状态时才会通知数据变化。

Kotlin Coroutines

Kotlin Coroutines是一种轻量级的线程管理工具,它通过使用挂起函数来简化异步编程,让异步代码看起来更像是同步代码。它能够使代码非阻塞地执行,同时不会牺牲应用的性能。

结合使用

将LiveData、ViewModel和Kotlin Coroutines结合使用可以创建一个高效、易于维护和测试的数据流。

  • ViewModel中通过Kotlin Coroutines启动异步任务获取数据。
  • 数据获取:在ViewModel中使用Coroutines来异步获取数据,不会阻塞主线程。
  • 数据更新:获取到数据后,使用LiveData来存储这些数据。因为LiveData是生命周期感知的,所以它会在Activity或Fragment活跃时自动更新UI。
  • UI观察LiveData:UI组件观察ViewModel中的LiveData,当数据发生变化时,UI会自动更新。

代码上,首先定义一个ViewModel,它包含LiveData来存储和管理UI相关数据

class MainViewModel : ViewModel() {private val _data = MutableLiveData<String>()val data: LiveData<String> = _datafun fetchData() {viewModelScope.launch {val result = withContext(Dispatchers.IO) { // 在IO线程中执行repository.getData()}_data.value = result }}
}

在Activity或Fragment中观察LiveData数据变化,并更新UI

class MainActivity : AppCompatActivity() {private val viewModel: MainViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)viewModel.data.observe(this, Observer { data ->textView.text = data})viewModel.fetchData()}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深入理解设计模式】命令设计模式

命令设计模式&#xff1a; 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户端进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 概述…

CentOS本地部署Tale博客并结合内网穿透实现公网访问本地网站

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

数据采集实训电商数据爬取python代码 电商数据抓取

电商平台的数据抓取&#xff0c;一直是网页抓取公式的热门实战实例&#xff0c;之前我们通常是针对国内的电商平台进行数据抓取&#xff0c;昨天小编受到委托&#xff0c;针对一个俄罗斯电商平台wildberries做了数据抓取&#xff0c;抓取的主要内容是商品标题、价格及评价数量。…

python导入的缓存机制

问题来源&#xff1a; logger文件 import sysfrom loguru import loggerfrom app.internal.component.configer import settingsdef configure_logger():"""多进程环境&#xff0c;需要确保子进程能拿到正确初始化的logger实例:return:"""logg…

基于单片机的指纹采集识别系统设计

目 录 摘 要 I Abstract II 引 言 3 1 硬件选择与设计 5 1.1 总体设计及方案选择 5 1.1.1主控单片机选择 5 1.1.2传感器模块选择 6 1.1.3显示器模块选择 6 1.2 系统总体设计 7 2 系统硬件电路设计 8 2.1 系统主电路设计 8 2.1.1 主体电路设计 8 2.1.2 单片机最小系统设计 8 2.…

h5唤起微信小程序

wx-open-launch-weapp 就用这个 开放标签属于自定义标签&#xff0c;Vue会给予未知标签的警告&#xff0c;可通过配置Vue.config.ignoredElements [wx-open-launch-weapp] 来忽略Vue对开放标签的检查。 sdk授权。 调试打开时iOS会弹窗 noPermissionJsApi: []&#xff0c;confi…

wpscan专门针对wordpress的安全扫描工具

说明 WPScan是一款专门针对WordPress的漏洞扫描工具&#xff0c;它使用Ruby编程语言编写。WPScan能够扫描WordPress网站中的多种安全漏洞&#xff0c;包括WordPress本身的漏洞、插件漏洞和主题漏洞。此外&#xff0c;WPScan还能扫描类似robots.txt这样的敏感文件&#xff0c;并…

题目 3152: 接龙数列

题目描述: 对于一个长度为 K 的整数数列&#xff1a;A1, A2, . . . , AK&#xff0c;我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字 (2 ≤ i ≤ K)。 例如 12, 23, 35, 56, 61, 11 是接龙数列&#xff1b;12, 23, 34, 56 不是接龙数列&#xff0c;因为…

基于FPGA的PSRAM接口设计与实现

该系列为神经网络硬件加速器应用中涉及的模块接口部分&#xff0c;随手记录&#xff0c;以免时间久了遗忘。 一 PSRAM与HyperRAM 1、概述 2、异同 接口协议不同&#xff0c;因此在IP设计时需要注意。 Hyperram(Winbond)&#xff1a;HyperBus协议 PSRAM(AP公司)&#xff1a;X…

【Linux内核文档翻译】NTB驱动程序

原文&#xff1a;NTB Drivers — The Linux Kernel documentation 译者&#xff1a;jklincn <jklincnoutlook.com> 日期&#xff1a;2024.03.07 NTB 驱动程序 NTB&#xff08;Non-Transparent Bridge&#xff0c;非透明桥&#xff09;是一种 PCI-Express 桥接芯片类型&a…

CSS中position的属性有哪些,区别是什么

position有以下属性值&#xff1a; 属性值概述absolute生成绝对定位的元素&#xff0c;相对于static定位以外的一个父元素进行定位。元素的位置通过left、top、right、bottom属性进行规定。relative生成相对定位的元素&#xff0c;相对于其原来的位置进行定位。元素的位置通过…

【深度学习实践】HaGRID,YOLOv5,手势识别项目,目标检测实践项目

文章目录 数据集介绍下载数据集将数据集转换为yolo绘制几张图片看看数据样子思考类别是否转换下载yolov5修改数据集样式以符合yolov5创建 dataset.yaml训练参数开始训练训练分析推理模型转换onnx重训一个yolov5s后记 数据集介绍 https://github.com/hukenovs/hagrid HaGRID&a…

Go语言与Rust哪一个更有发展前景?

Go语言和Rust都是目前非常受欢迎的编程语言&#xff0c;它们各自具有独特的优势和适用场景。关于哪一个更有发展前景&#xff0c;这实际上取决于多个因素&#xff0c;包括个人偏好、项目需求、社区支持以及未来技术的发展趋势等。 Go语言是由Google推出的&#xff0c;具有简洁…

户外大屏:六个必备的户外大屏推广工具助你脱颖而出-华媒舍

1. 大屏幕LED显示屏 大屏幕LED显示屏是一种常见而有效的户外推广工具。它采用LED背光源和高分辨率显示屏&#xff0c;能够在户外环境中展示鲜艳丰富的图像和视频内容。这种显示屏广泛应用于广场、商业街、体育场馆等公共场所&#xff0c;成为吸引人们目光的重要工具。 大屏幕…

使用route的reject拒绝境外ip通信

#以下是centos系统格式版&#xff0c;&#xff08;win不支持&#xff0c;搜本博&#xff0c;错误路由方式处理&#xff09; curl -# -O http://ftp.apnic.net/stats/apnic/legacy-apnic-latestcat legacy-apnic-latest | grep -v * | grep -v > 1.txtsed -i s/256/24…

蓝桥杯——数组切分

数组切分 题目分析 这里要搞清楚一个点就是满足区间内数字是连续数字的区间有什么样的特点&#xff0c;既然数字连续重新排列后的数字为n,n1,n2,n3,n4,…nlen&#xff0c;则最大数字和最小数字之差恰好是区间长度减1&#xff0c;即nlen-nlen&#xff0c;同样因为下标也是连续…

释机器学习中的召回率、精确率、准确率

精确率和召回率又被叫做查准率和查全率&#xff0c;可以通过P-R图进行表示 如何理解P-R(精确率-召回率)曲线呢&#xff1f;或者说这些曲线是根据什么变化呢&#xff1f; 以逻辑回归举例&#xff0c;其输出值是0-1之间的数字。因此&#xff0c;如果我们想要判断用户的好坏&…

MySQL的索引(优缺点,二叉树,红黑数,B+Tree)【详解】

1.什么是索引 索引&#xff1a;是用于提高查询数据性能的一种数据结构。实际开发中&#xff0c;对数据的读写操作大概是10&#xff1a;1 把索引理解为目录。 构建索引的过程&#xff0c;就是构建目录的过程 构建索引的过程中会对数据进行排序 2.索引的优缺点 优点&#x…

纳米体育数据足球数据接口:实时数据包接口文档API示例⑨

纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口&#xff0c;无请求次数限制&#xff0c;可按需购买&#xff0c;接口稳定高效&#xff1b;覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。 纳米数据API2.0版本…

基于逻辑回归与决策树的地质灾害预测

大家好&#xff0c;我是带我去滑雪&#xff01; 地质灾害的预测对于人们的生命财产安全、社会稳定和经济发展具有重要意义。地质灾害如地震、泥石流、山体滑坡等往往会造成严重的人员伤亡和财产损失。大规模的地质灾害往往会导致社会秩序混乱、人员流动、灾民避难等问题&#x…