深入分析 Android Activity (四)

文章目录

      • 深入分析 Android Activity (四)
      • 1. Activity 的生命周期详解
        • 1.1 `onCreate`
        • 1.2 `onStart`
        • 1.3 `onResume`
        • 1.4 `onPause`
        • 1.5 `onStop`
        • 1.6 `onDestroy`
        • 1.7 `onRestart`
      • 2. Activity 状态的保存与恢复
        • 2.1 保存状态
        • 2.2 恢复状态
      • 3. Activity 的启动优化
        • 3.1 延迟初始化
        • 3.2 使用 `ViewStub`
        • 3.3 分析启动性能
      • 4. 深入理解 Activity 的窗口管理
        • 4.1 `Window`
        • 4.2 `WindowManager`
      • 5. Activity 的任务和返回栈管理
        • 5.1 启动 Activity 的 Intent 标志
        • 5.2 处理返回栈中的数据
      • 6. Activity 的内存管理
        • 6.1 内存泄漏检测
      • 7. Activity 的主题和样式
        • 7.1 自定义主题
        • 7.2 动态切换主题
      • 总结

深入分析 Android Activity (四)

1. Activity 的生命周期详解

Activity 的生命周期方法提供了一组回调,使开发者能够在不同状态下执行相应的逻辑。了解这些方法有助于开发者管理资源和确保应用程序的行为一致。

1.1 onCreate

onCreateActivity 的入口点,系统在创建 Activity 时调用。这个方法是设置界面和初始化资源的最佳位置。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Initialize resources
}
1.2 onStart

onStart 方法在 Activity 对用户可见时调用,但此时用户还无法进行交互。此方法适合开始准备界面所需的资源。

@Override
protected void onStart() {
    super.onStart();
    // Prepare resources that need to be visible to the user
}
1.3 onResume

onResume 方法在 Activity 准备好与用户进行交互时调用。此方法适合开始动画、音频播放等需要用户交互的操作。

@Override
protected void onResume() {
    super.onResume();
    // Resume animations, audio playback, etc.
}
1.4 onPause

onPause 方法在 Activity 即将停止与用户交互时调用。这是保存数据和停止动画等操作的好时机。

@Override
protected void onPause() {
    super.onPause();
    // Pause animations, save data, etc.
}
1.5 onStop

onStop 方法在 Activity 不再对用户可见时调用。此方法适合释放不再需要的资源。

@Override
protected void onStop() {
    super.onStop();
    // Release resources no longer needed
}
1.6 onDestroy

onDestroy 方法在 Activity 被销毁前调用。这里是进行最终清理的好地方。

@Override
protected void onDestroy() {
    super.onDestroy();
    // Clean up resources
}
1.7 onRestart

onRestart 方法在 Activity 从停止状态重新启动时调用。这里可以重新初始化在 onStop 方法中释放的资源。

@Override
protected void onRestart() {
    super.onRestart();
    // Re-initialize resources released in onStop
}

2. Activity 状态的保存与恢复

为了应对配置变化和进程被系统回收等情况,Activity 提供了 onSaveInstanceStateonRestoreInstanceState 方法来保存和恢复状态。

2.1 保存状态

onSaveInstanceStateActivity 即将被销毁时调用,用于保存临时状态信息。

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("key", "value");
}
2.2 恢复状态

onRestoreInstanceStateActivity 被重新创建后调用,用于恢复之前保存的状态信息。

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String value = savedInstanceState.getString("key");
}

也可以在 onCreate 方法中恢复状态:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        String value = savedInstanceState.getString("key");
    }
}

3. Activity 的启动优化

在实际开发中,优化 Activity 的启动时间对于提升用户体验非常重要。以下是一些常见的优化技巧:

3.1 延迟初始化

将非关键资源的初始化延迟到用户实际需要的时候,从而减少 onCreate 方法的执行时间。

// Load non-critical data after the UI is rendered
private void loadNonCriticalData() {
    new Handler().postDelayed(() -> {
        // Load non-critical data here
    }, 1000);
}
3.2 使用 ViewStub

对于可能不会立即显示的布局,可以使用 ViewStub 延迟加载。

<ViewStub
    android:id="@+id/view_stub"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout="@layout/your_layout"/>

在代码中加载:

ViewStub viewStub = findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();
3.3 分析启动性能

使用 Android Profiler 分析 Activity 的启动性能,找到并优化瓶颈。

// Profile your app to identify performance bottlenecks

4. 深入理解 Activity 的窗口管理

4.1 Window

WindowActivity 管理视图的顶级窗口,Activity 使用 PhoneWindow 类来实现。Window 管理状态栏、标题栏和内容区域。

4.2 WindowManager

WindowManager 是一个系统服务,负责管理窗口。通过 WindowManager 可以控制窗口的布局参数。

Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(params);

5. Activity 的任务和返回栈管理

Android 使用任务和返回栈来管理 Activity 的导航。每个任务由一个栈来管理 Activity

5.1 启动 Activity 的 Intent 标志

使用 Intent 标志控制 Activity 的启动行为和返回栈。例如:

  • FLAG_ACTIVITY_NEW_TASK:在新的任务中启动 Activity
  • FLAG_ACTIVITY_CLEAR_TOP:如果目标 Activity 已经在栈中存在,则将其上面的所有 Activity 清除。
Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
5.2 处理返回栈中的数据

使用 onActivityResult 方法处理从另一个 Activity 返回的数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        String result = data.getStringExtra("key");
        // Handle the result
    }
}

在启动 Activity 时可以传递请求代码:

Intent intent = new Intent(this, AnotherActivity.class);
startActivityForResult(intent, REQUEST_CODE);

6. Activity 的内存管理

Android 系统会在内存不足时终止后台 Activity,以释放资源。因此,必须在 onSaveInstanceStateonRestoreInstanceState 中保存和恢复关键数据。

6.1 内存泄漏检测

使用工具如 LeakCanary 进行内存泄漏检测:

// Add LeakCanary dependency in build.gradle
dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.7'
}

// Initialize LeakCanary in Application class
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (LeakCanary.isInAnalyzerProcess(this)) {
            return;
        }
        LeakCanary.install(this);
    }
}

7. Activity 的主题和样式

通过自定义主题和样式,可以统一管理 Activity 的外观和行为。

7.1 自定义主题

res/values/styles.xml 中定义自定义主题:

<resources>
    <style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

AndroidManifest.xml 中应用自定义主题:

<activity android:name=".MyActivity"
    android:theme="@style/CustomTheme">
</activity>
7.2 动态切换主题

通过 recreate 方法动态切换 Activity 的主题:

// Change theme and recreate Activity
setTheme(R.style.CustomTheme);
recreate();

总结

Android Activity 的设计涵盖了生命周期管理、视图层次结构、任务和返回栈管理、内存管理、主题和样式等方面。理解这些概念和内部实现有助于开发者创建高效、稳定和响应迅速的应用程序。通过灵活应用这些知识,可以提升应用程序的用户体验和性能。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】自定义类型:联合与枚举的简明概述

&#x1f525;引言 关于自定义类型除了我们常用的结构体&#xff0c;还有联合与枚举也是属于自定义类型。本篇将简单介绍联合与枚举基本概念和使用方法 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&…

基于jeecgboot-vue3的Flowable新建流程定义(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 8、同时可以进行流程的编辑 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)designerData.title "流程设…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

ROM的简单实现

描述 实现一个深度为8&#xff0c;位宽为4bit的ROM&#xff0c;数据初始化为0&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;10&#xff0c;12&#xff0c;14。可以通过输入地址addr&#xff0c;输出相应的数据data。 接口信号图如下&#xff1a; 使用Veri…

MIPS汇编语言详解

MIPS&#xff08;Microprocessor without Interlocked Pipeline Stages&#xff09;是一种精简指令集计算机&#xff08;RISC&#xff09;架构&#xff0c;由MIPS计算机系统&#xff08;现在是MIPS Technologies&#xff09;开发。它以其简单性和效率而闻名&#xff0c;特别适用…

【数据结构】排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较、解析+完整代码

文章目录 八、排序1.插入排序1.1 直接插入排序1.2 折半插入排序1.3 希尔排序 2.交换排序2.1 冒泡排序2.2 快速排序 3.选择排序3.1 简单选择排序3.2 堆3.2.1 堆排序3.2.2 堆插入删除*完善代码 堆 4.归并、基数、计数排序4.1 归并排序4.2 基数排序4.3 计数排序 5.内部排序算法的比…

PCL 二维凸包切片法计算树冠体积

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 二维凸包法是先将树冠等间隔分层切片,如图(e)采用二维凸包算法对每层…

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力?

中国改革报是什么级别的报刊&#xff1f;在哪些领域具有较高的影响力&#xff1f; 《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸。它在经济领域和改革发展方面具有重要的影响力&#xff0c;是传递国家政策、反映改革动态的重要平台。该报对于推动中国的经济改…

实验室课程|基于SprinBoot+vue的实验室课程管理系统(源码+数据库+文档)

实验室课程管理系统 目录 基于SprinBootvue的实验室课程管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

PyTorch深度学习实战(44)——基于 DETR 的目标检测模型

PyTorch深度学习实战&#xff08;44&#xff09;——基于 DETR 的目标检测模型 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0.…

WindowsCMD窗口配置OhMyPosh

WindowsCMD窗口配置OhMyPosh 文章目录 WindowsCMD窗口配置OhMyPosh1. 按装Clink1. 安装Oh-My-Posh2. 安装Clink2. 安装后的位置 2. 编写Lua脚本1. oh-my-posh Lua脚本2. 重启cmd窗口看效果 OhMyPosh对Windows CMD 没有现成的支持。 然而可以使用Clink来做到这一点&#xff0c;它…

深度学习——自己的训练集——训练模型(CNN)

训练模型 1.导入必要的库2.加载类别名称3.创建标签映射字典4.加载图像数据和对应的标签5.构建和编译CNN模型6.训练模型7.保存训练好的模型 1.导入必要的库 导入处理数据和训练模型时需要的库 os: 这个模块提供了与操作系统交互的功能&#xff0c;比如文件和目录操作。 cv2: 这…

2024-5-10-从0到1手写配置中心Config之Spring Value热更新

定义SpringValueProcessor处理类 实现BeanPostProcessor后置处理器接口&#xff0c;扫描所有的Spring value&#xff0c;保存起来。实现ApplicationListener接口&#xff0c;在配置变更时&#xff0c;更新所有的spring value 实现BeanPostProcessor后置处理器接口 实现postPr…

移动云:连接未来的智慧之旅

随着数字化转型的加速&#xff0c;云服务在各行各业中的应用越来越广泛。移动云不仅提供了灵活的计算和存储资源&#xff0c;还通过创新的技术手段&#xff0c;为企业和开发者解决了许多实际问题。在这个变革的大背景下&#xff0c;移动云服务作为中国移动倾力打造的云业务品牌…

155. 最小栈

题目&#xff1a; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…

深入解析内置模块OS:让你的Python代码更懂操作系统

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、OS模块简介与基础应用 二、文件与目录操作详解 三、OS模块的高级应用&#xff1a;双色…

【算法】前缀和——除自身以外数组的乘积

本节博客是用前缀和算法求解“除自身以外数组的乘积”&#xff0c;有需要借鉴即可。 目录 1.题目2.前缀和算法3.变量求解4.总结 1.题目 题目链接&#xff1a;LINK 2.前缀和算法 1.创建两个数组 第一个数组第i位置表示原数组[0,i-1]之积第二个数组第i位置表示原数组[i1,n-1]…

How to limit request by IP on nginx?

/etc/nginx/conf.d/default.conf 1.Define a limit_req_zone # 定義限流區塊 limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; 是一个 Nginx 配置指令&#xff0c;用于定义请求限制区域和…

【linux】多线程(2)

文章目录 线程的应用生产消费者模型自制锁生产消费队列成员参数生产函数消费函数 任务处理方式主函数 POSIX信号量sem_wait()sem_post() 线程池应用场景示例 单例模式饿汉实现单例 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.懒汉实现单例…

GMSL2硬件设计V1.1

一、说明 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司(现属于ADI)推出的一种高速串行接口,通过同轴电缆或屏蔽双绞线(STP)传输高速串行数据,用于汽车摄像头和显示器应用。GMSL2就是指ADI专有的第二代千兆多媒体串行链路技术,传输…