Android应对内存压力时保存UI状态的策略

Unity游戏截图保存至安卓相册:权限、MediaStore与原生插件全解析 在移动应用开发中,数据持久化与跨平台文件交互是核心基础技术,其原理涉及操作系统权限管理、沙盒机制与存储API的协同。随着Android系统引入分区存储(Scoped Storage)安全策略,传统的直接文件路径写入方式已不再适用,开发者必须通过MediaStore这一系统内容提供器进行标准化媒体文件管理,这确保了用户隐私与应用数据隔离的技术价值。在游戏开发领域,Unity引擎需与原生平台深度桥接以实现高性能截图保存,典型应用场景包括玩家社区分享、成就系统记录与开发调试。本文聚焦Unity游戏截图保存至安卓相 阅读详情

当一个应用程序启动时,Android系统用一个执行线程(主线程)为该应用程序启动一个新进程。在Android中,应用程序本身并不直接控制其进程生命周期。相反,系统会根据应用程序对用户的重要性和总内存的可用性来确定应用程序的生存期。在可用内存非常低的危急情况下,系统需要通过杀死最不必要的进程来回收内存,以保持系统的正常运行。本文将讨论Android系统如何决定在不影响用户的情况下杀死哪个应用程序来释放内存,以及在应用程序被系统杀死时保存UI状态的策略。

内存压力与进程优先级

内存压力是系统内存不足的状态。系统需要通过终止不重要的进程或请求进程释放非关键的缓存资源来释放内存。在决定要杀死哪些进程时,Android系统会根据运行在其中的组件和这些组件的状态来权衡它们对用户的相对重要性。

以下是进程的重要性层次结构(不包括Linux附带的本机或系统进程):

前景处理:用户当前正在与之交互的进程。如果一个过程满足以下条件之一,则认为它处于前景中:

在屏幕顶部有一个正在运行的活动(已调用该活动的onResume()回调)。
具有正在运行的广播接收器(正在执行onReceive()方法)。
包含当前正在其某个回调(onCreate()、onStart()或onDestroy()中执行代码的服务。
这些进程具有最高优先级,并且是在内存压力下最后被终止的进程。

可见过程:以某种方式用户可以感知到的过程,例如在后台播放音乐的应用程序。在以下条件下,过程被视为可见:

1、具有一个正在运行的活动,该活动在屏幕上对用户可见,但在前台不可见(已调用该活动的onPause()回调)。例如,前台活动向用户显示一个对话框。
2、前台服务正在运行
3、包含系统正在为用户知道的特定功能使用的服务,例如实时墙纸或输入法服务。这些进程也被认为是重要的,不会被终止,除非这样做是为了保持所有前台进程的运行。
服务流程:包含用于执行诸如后台网络数据上载或下载、存储压缩…已运行很长时间的服务的进程的重要性可能会降级,以避免过度使用资源。虽然这些进程对用户来说不是直接可见的,但它们通常仍在做一些基本的事情,因此系统会尽量使它们保持活动状态—没有足够的内存来保留所有前景和可见的进程。

缓存进程:用户以前使用过但当前不需要的进程。它们被保存在内存中,以便在应用程序之间切换时提高效率。当其他地方需要内存等资源时,系统可以根据需要随意终止这些进程。过程越旧,越有可能先被杀死。

在决定如何对流程进行分类时,系统将根据流程中当前活动的所有组件中最重要的级别进行决策。如果您不希望在用户离开应用程序时终止长时间运行的操作,请确保您的进程具有高优先级。你可以访问官方指南流程和应用程序生命周期了解有关流程和应用程序生命周期的更多信息。

当应用程序在内存压力下被终止时保留UI状态

如果用户暂时离开你的应用程序,稍后再回来,他们希望用户界面保持不变。但是,当用户不在时,系统可能会破坏应用程序的进程。为了确保流畅的用户体验,你的应用程序应该保持用户界面状态,因为它以前从未被杀死过。

当活动由于内存限制而被销毁时,系统会记住它的存在,并在该活动被杀死之前保存一组数据。这些保存的数据称为实例状态并且将在稍后重新创建活动时可用。

onSaveInstanceState()

当活动开始停止时,系统将为活动调用onSaveInstanceState()方法以保存必要的信息。数据将存储在Bundle对象中,该对象是一组键值对。此方法的默认实现已经保存了活动的视图层次结构的状态,例如EditText中的文本或RecyclerView的当前滚动位置。因此,在重写onSaveInstanceState()时,应该始终调用超级类实现。

// Code from: https://developer.android.com/guide/components/activities/activity-lifecycle#save-simple,-lightweight-ui-state-using-onsaveinstancestate
override fun onSaveInstanceState(outState: Bundle?) {
    // Save the user's current game state
    outState?.run {
        putInt(STATE_SCORE, currentScore)
        putInt(STATE_LEVEL, currentLevel)
    }

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(outState)
}

companion object {
    val STATE_SCORE = "playerScore"
    val STATE_LEVEL = "playerLevel"
}

onSavedInstanceState()需要在主线程上序列化,并消耗系统进程内存,因此不适合存储大量数据。如果需要保留更复杂的数据结构或更持久的数据结构,请考虑在活动处于前台时将数据保存在本地数据库或SharedPreferences中。

onRestoreInstanceState()

当您的活动在先前被销毁后重新创建时,您可以同时使用onCreate()和onRestoreInstanceState()回调方法来接收保存的实例状态。

对于onCreate()方法,在尝试读取状态束之前,必须检查它是否为null。如果为null,则系统将创建活动的新实例,而不是恢复先前已销毁的实例。

// Code from: https://developer.android.com/guide/components/activities/activity-lifecycle#save-simple,-lightweight-ui-state-using-onsaveinstancestate
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState) // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        with(savedInstanceState) {
            // Restore value of members from saved state
            currentScore = getInt(STATE_SCORE)
            currentLevel = getInt(STATE_LEVEL)
        }
    } else {
        // Probably initialize members with default values for a new instance
    }
    // ...
}

另一种恢复数据的方法是使用onRestoreInstanceState(),系统在onStart()方法之后调用它。只有在有要还原的已保存状态时,系统才会调用此方法,因此不需要进行空检查。

// Code from: https://developer.android.com/guide/components/activities/activity-lifecycle#save-simple,-lightweight-ui-state-using-onsaveinstancestate
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState)

    // Restore state members from saved instance
    savedInstanceState?.run {
        currentScore = getInt(STATE_SCORE)
        currentLevel = getInt(STATE_LEVEL)
    }
}

在活动包含ViewModel的情况下,可以使用 保存状态句柄通过它的构造函数。SavedStateHandle对象是一个键值映射,允许您写入和检索数据。这些值在进程被系统终止后继续存在,并在同一对象中保持可用。

不要保留活动

“不要保留活动”是“开发人员选项”下的一个设置,它会在用户离开时立即销毁每个活动。此设置旨在模拟Android由于内存压力而在后台杀死一个活动的情况。所以这是一个非常方便的工具来调试你的应用程序。

举个例子:

这里我们有两个活动,第一个活动要求用户输入他们的名字,第二个活动执行一个简单的计数器。用户名将存储在对象类中,因为我们需要来自应用程序的其他部分。

// WelcomeActivity.kt
// static object to store user data
object UserInfo {
    var name: String = "Unknown"
}

class WelcomeActivity : AppCompatActivity() {

    private lateinit var binding: ActivityWelcomeBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityWelcomeBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        binding.confirmButton.setOnClickListener {
            UserInfo.name = binding.usernameInput.text.toString()
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }
    }
}
// MainActivity.kt
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    private var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        setWelcomeText()
        setCounterText()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt(STATE_COUNTER, count)
    }

    private fun setWelcomeText() {
        binding.welcomeText.text = "Hello ${UserInfo.name}"
    }

    private fun setCounterText() {
        binding.counter.text = count.toString()
    }
}

如您所见,我们目前没有任何机制来保存UI状态。如果在启用“不保留活动”设置时按“主页”按钮,活动将被销毁。再次打开应用程序时,计数器将重置为0。
所以我们知道设置的作用,让我们实现onSaveInstanceState()方法来保持状态并使我们的应用程序满足用户的期望。

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    private var count = 0

    companion object {
        private const val STATE_COUNTER = "state_counter"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        if(savedInstanceState != null) {
            count = savedInstanceState.getInt(STATE_COUNTER)
        }

        setWelcomeText()
        setCounterText()
    }

   override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt(STATE_COUNTER, count)
    }
}

现在回到应用程序后,计数器已经成功恢复,一切正常,对吧?嗯,有一个陷阱。在内存压力下,系统不会直接终止活动来释放内存。相反,它会杀死运行活动的进程,不仅破坏活动,而且还会破坏进程中运行的所有其他内容。您可能已经看到了我们示例中的问题。我们将用户名存储在一个静态对象中,只要进程还活着,它就一直是活动的。请记住,“不要保留活动”只会破坏单个活动,而不是过程本身。但在现实生活中,整个过程都会被杀死,所以所有静态对象也都消失了。
现在,我们需要做的就是存储用户名,然后就可以开始了。

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    private var count = 0

    companion object {
        private const val STATE_COUNTER = "state_counter"
        private const val STATE_USER_NAME = "state_user_name"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        if(savedInstanceState != null) {
            count = savedInstanceState.getInt(STATE_COUNTER)
            UserInfo.name = savedInstanceState.getString(STATE_USER_NAME, "")
        }

        setWelcomeText()
        setCounterText()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt(STATE_COUNTER, count)
        outState.putString(STATE_USER_NAME, UserInfo.name)
    }
}

结论

保存和恢复活动的UI状态是用户体验的关键部分。有很多事情需要考虑,以确保你的应用程序运行得尽可能顺利。记住要在特殊的约束条件下测试你的应用程序,可能会出现一些你没有预料到的随机错误。

Unity移动端截图保存相册全攻略:从NativeGallery集成到性能优化 在移动应用开发中,实现屏幕截图并保存至系统相册是常见的功能需求,其核心在于理解跨平台文件系统交互与权限管理机制。Unity开发者通常需要处理从GPU渲染缓冲区获取像素数据、编码为图像格式,并安全写入公共存储区域的技术流程。这一过程不仅涉及图形渲染管线,还要求对iOS的Photos框架和Android的MediaStore API有深入理解,以确保在不同操作系统版本上的兼容性。通过集成成熟的插件如NativeGallery,开发者可以高效处理权限申请、文件写入和媒体库更新等繁琐操作,显著提升开发效率与功能稳定 阅读详情

相关推荐

PC微信登录二维码自动刷新机制逆向分析与自动化应对策略

在客户端开发与自动化测试领域,理解软件的内部工作机制是解决复杂问题的关键。二维码作为一种广泛使用的身份验证与信息交互技术,其生成、刷新机制直接关系到用户体验与系统安全。从技术原理上看,客户端通常通过定时器或事件驱动模型来管理动态内容的更新,这涉及到状态机设计、网络请求调度以及资源管理等多个核心概念。这种机制的技术价值在于平衡了实时性、安全性与服务器负载,确保了会话的有效性与防伪能力。在自动化工具开发、安全研究等应用场景中,分析此类机制有助于设计更稳定、高效的解决方案。本文以PC微信客户端的登录二维码为具体案

weixin_34337381的博客 1152

UGUI学习之缓存策略让UI打开更快

http://www.xuanyusong.com/archives/4430

jiewnag的博客 297

Android进程被杀问题深度解析:从Logcat日志到内存泄漏定位

在Android应用开发中,进程管理是系统资源调度的核心机制之一,它通过OOM Adj优先级算法来平衡内存使用与用户体验。当系统内存不足时,LowMemoryKiller会依据进程优先级终止后台应用,这一过程通常体现在Logcat的ActivityManager日志中。理解这一原理对于优化应用性能至关重要,尤其是在处理内存泄漏和后台保活场景时。通过分析dumpsys meminfo和procstats等系统工具的输出,开发者可以精准定位PSS内存异常增长的根源,例如未释放的Bitmap或静态集合持有。本文聚

weixin_30627341的博客 401

Android UI 冻结处理方法

top,meminfo,bugreport,tombstone,anr等日志,具体抓取方法可以在参考其他文章。触摸屏幕,观察“adb shell getevent”的输出,看到触摸事件是否打印在屏幕。主要方法就是抓日志,看现象。

tianshi4851的专栏 2651

安卓APP性能深度体检:使用SoloPi监控CPU、内存与网络流量

在移动应用开发中,性能监控是保障用户体验的关键环节。其核心原理在于通过实时采集应用的运行时数据,量化评估其资源消耗与效率。这项技术的价值在于,它能将主观的“卡顿”、“耗电”感受转化为客观的CPU使用率、内存占用和网络流量等指标,帮助开发者精准定位性能瓶颈。在实际的工程实践中,性能监控广泛应用于应用启动优化、列表流畅度保障、内存泄漏排查及后台行为分析等场景。本文将聚焦于安卓平台,详细介绍如何利用阿里巴巴开源的SoloPi工具,对应用进行全方位的性能“体检”。通过实战演示,你将学会如何监控CPU使用率以揪出计算

weixin_33766805的博客 378

告别Auto.js6内存泄漏烦恼:手把手教你用Android API写内存看守狗(Watchdog)

本文详细介绍了如何利用Android API构建Auto.js6内存看守狗(Watchdog),解决自动化脚本开发中的内存泄漏问题。通过深入解析Android内存监控API和提供可配置的看守狗服务,帮助开发者有效管理内存,提升脚本稳定性。文章还分享了高级内存管理技巧和实战集成案例,适用于长期运行的自动化项目。

weixin_28692817的博客 328

android 模拟冻屏 代码实现

思路: 第一种方案:屏蔽除power外的其他按键,屏蔽状态栏下拉,屏蔽触屏。 代码如下: 需要系统签名: 添加权限:         package com.example.demo; import android.app.Activity; import android.os.Bundle; import android.view.KeyE

程序员入门进阶 2350

安卓手机独立运行UI自动化测试:Termux+uiautomator2环境搭建与实战

UI自动化测试是移动应用质量保障的核心技术,其原理是通过脚本模拟用户操作,对应用界面进行功能性验证。这项技术能显著提升测试效率与覆盖率,尤其适用于回归测试与兼容性验证。在安卓平台,uiautomator2作为基于Python的流行框架,极大地简化了脚本开发。传统方案依赖电脑与ADB连接,限制了测试的灵活性与设备独立性。本文聚焦于解决这一痛点,深入探讨如何在安卓手机内部的Termux Linux环境中,配置uiautomator2与ADB服务,实现设备自洽的自动化测试。文章将详细解析ADB本地自连接、atx-

weixin_33858485的博客 380

Activity系列--Activity界面状态数据保存恢复-源码分析

Activity界面状态保存恢复这机制,android底层封装了一套完美的框架,让我们不需要关心底层的细节,让我们使用的时候能有多简单就有多简单,比如我们想保存和恢复Activity层面的数据,那就重写Activity的onSaveInstanceState和onRestoreInstanceState方法,比如我们想对自定义view,进行保存和恢复操作,同样也只需要重写onSaveInstanceState和onRestoreInstanceState方法即可。这就是框架的魅力所在吧。

niurenwo的专栏 2295

SystemUI 解决密码输入界面与锁屏界面重复(原生系统同样存在)

不积跬步无以至千里 一.前摘 层叠效果如上图,其实我们前边已经写过优化类似的场景文章:优化锁屏解锁界面层叠问题 ,这里是对这种场景的补充。这种场景是点击自定义通知里面的控件有会通过通知直接做一些快捷操作的功能(比如快捷的回复一些消息等场景),通知做的这类自定义通知,因为此时在锁屏的状态下,所以需要先会调起Bouncer界面解锁后才能处理此快捷功能,然后这里会导致界面重叠的情形。 二.分析与解决 通过在Bouncer界面的show方法中打印调用栈,查到了此调...

Older_Fisher的博客 733

5分钟搞定PaddleOCR PP-OCRv5环境搭建:从安装到第一个识别Demo

本文提供了一份详细的PaddleOCR PP-OCRv5环境搭建与快速入门指南。通过清晰的步骤,指导读者在5分钟内完成从创建Python虚拟环境、安装PaddlePaddle框架和PaddleOCR库,到编写并运行第一个OCR识别Demo的全过程,帮助开发者快速体验最新的PP-OCRv5模型的文字识别能力。

sprite的博客 1270

Material Remixer:Android应用实时UI调试与A/B测试的完整解决方案

在现代移动应用开发中,实时UI调试和A/B测试已成为提升用户体验的关键环节。Material Remixer作为一款专为Android平台设计的动态UI调整框架,为开发者提供了无需重新构建应用即可实时调整界面参数的能力。这款工具不仅简化了UI调试流程,还支持多设备同步和团队协作,极大地提升了开发效率和产品质量。 ## 核心功能解析:从基础调试到高级应用 Material Remixer的核心价

gitblog_00635的博客 808

汽车工程师必看:从CAN到Ethernet,6种车载通信协议全解析(附应用场景对比)

本文全面解析了从CAN到Ethernet的6种车载通信协议,包括CAN、LIN、MOST、FlexRay等,并对比了它们的应用场景和技术特点。文章详细介绍了各协议的演进历程、技术优势及在现代汽车中的混合网络架构设计,为汽车工程师提供了实用的协议选型指南和未来通信技术发展趋势。

weixin_28683689的博客 493

android 查看内存所以字符串,Android优化笔记--内存优化

内存介绍内存优化,首先解释一下什么是内存,很多同学常常只是在开发应用,说到内存,感到这个概念很“飘”,因为涉及并不太多;内存: 它是外存与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器和主存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,操作系统就会把需要运...

weixin_42360953的博客 180

STM32H743 LAN8720网口配置避坑指南:用CubeMX v6.5.0快速搞定LWIP+FreeRTOS

本文详细介绍了使用CubeMX v6.5.0配置STM32H743与LAN8720网口的LWIP+FreeRTOS方案,涵盖硬件连接、时钟配置、ETH外设初始化及LWIP协议栈调优等关键步骤。特别针对常见陷阱提供解决方案,帮助开发者快速实现稳定网络通信,适用于嵌入式网络开发场景。

weixin_33739523的博客 357

语言随机效应模型_线性混合效应模型 VS 方差分析

线性混合效应模型相比方差分析具有很多优点。为了让大家更直观的了解,我们来做一下两者的对比。基于模拟的方法,生成了以下数据dat_sim:这种数据格式是长格式,也就是从实验软件导出来的那种数据格式。这种数据格式可以直接使用线性混合效应模型进行分析。该实验设计是被试内项目间的单因素两水平设计。category是自变量,两个水平分别是outgroup和ingroup,outgroup比ingr...

weixin_31960565的博客 2688

ArkUI-X/arkui_for_android状态管理:组件状态持久化

在移动应用开发中,状态管理是一个至关重要的环节。当应用被切换到后台、设备旋转或配置变更时,如何保持组件的状态不丢失,直接影响用户体验。ArkUI-X作为华为推出的跨平台UI框架,在Android平台的适配层`arkui_for_android`中提供了完善的状态持久化机制。本文将深入解析其实现原理和使用方法。 ## 状态持久化的核心挑战 在Android平台上,状态持久化面临的主要挑战包括: ...

gitblog_00486的博客 860

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

Systemcall名屋 2084

Android Studio集成Scrcpy实现高效安卓投屏与调试

屏幕镜像技术通过将移动设备画面实时投射到电脑显示器,实现了跨设备视觉同步。其核心原理通常基于视频编码压缩与网络传输协议,在保证画质的同时降低延迟。这项技术的工程价值在于极大提升了开发调试、演示协作和自动化测试的效率,尤其适用于需要大屏展示复杂交互或多人协同的场景。本文聚焦于Android开发环境,深入探讨如何利用Scrcpy这一开源投屏工具,结合ADB调试桥与硬件编码技术,实现低延迟、可交互的安卓手机屏幕镜像。通过将其深度集成到Android Studio IDE中,开发者能够无缝进行UI调试、性能监控与操

weixin_30271335的博客 350

华为OD机试真题目录汇总(Java语言)2024 B+C+D+E卷 (560道)

本文是2023华为OD机试真题(Java 语言) B卷专栏的目录贴(定期更新2023华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Java语言进行更新解答,包含真题,思路分析,代码参考,每个题目的思路分析都非常详细,超过百字欢迎大家订阅学习,代码可以直接运行使用,全网限时最低价,持续更新)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。

KJ.JK 8万+

65页PPT全面学习大型汽车集团企业IT信息化(管理架构、应用架构、技术架构)

订单到交付(OTD):借助ERP、MES、LES、SRM、QMS、APS等系统,实现财务与业务一体化、高级排产、生产过程自动化及供应链协同。- 数据标准化:数据标准化是企业信息化建设基石,包括制定统一业务解释和标准、维护管理流程、发布应用等,涉及数据统一定义、分类、编码等内容。- 大数据应用:汽车行业大数据应用涵盖生产、销售、售后等环节,如设备预见性保养、销量预测、质量预警等,提升企业运营效率和决策能力。- 策略明晰:明确C2M管理矩阵,包括供应商、采购、物流、制造、销售、财务等环节的策略。

cdfunlove的博客 1050

Flutter 页面切换后为什么会“状态丢失”或“状态常驻”?

本文探讨了Flutter页面生命周期中的常见误区与解决方案。作者指出,页面状态问题主要源于对路由栈机制的理解不足:页面是否存活取决于其在路由栈中的位置,而非框架本身的问题。文章分析了两种核心情况(页面保留与重建),并针对Tab切换重复请求、滚动位置记忆等典型场景给出了技术方案(KeepAlive、PageStorage)。最后强调,状态管理本质是产品设计决策,需要根据页面使用频率和用户体验需求,合理选择常驻或重建策略。理解这些机制后,开发者能更精准地控制页面生命周期。

qq_36863796的博客 1040

基于DeepFashion2和YOLOv12的服装检测系统:从数据集构建到UI界面实现

官方网站:数据集大小: 约80GB(压缩包)包含训练集、验证集和测试集数据集目录结构:text复制下载├── train/└── test/├── image/├── annos/Backbone优化:使用更高效的CSPNet结构Neck增强:引入BiFPN特征金字塔网络Head改进:使用解耦头(Decoupled Head)提升分类和定位精度损失函数:采用CIoU损失和分类Focal Loss训练策略:引入Mosaic数据增强和自适应锚框python复制下载。

YOLO 499

Android超实用最全面试大纲(三),2024Android笔试题总结

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节祝大家都能得到自己心仪工作。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149381的博客 1026

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android超实用最全面试大纲(三)

Bitmap相关其他相关##三、Bitmap面试题LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中##四、UI卡顿面试题View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象布局优化。

2401_84123113的博客 832

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 用2022年最新安卓秋招面试题来搭建你的Android知识体系
下一篇: 在Android面试前背八股和学面试技巧真的有用吗?
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值