Android源码学习之四-ActivityGroup是如何对嵌入的Activitys进行管理的

本文主要是介绍Android源码学习之四-ActivityGroup是如何对嵌入的Activitys进行管理的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此前,我们对Activity进行了一些学习,在Android中,还提供了一个ActivityGroup类,该类是Activity的容器,可以包含多个嵌套进来的Activitys,我们接下来依然采用源码分析的方式来了解该类的内部实现。

首先,从SDK中和源码中都可以获知,ActivityGroup类的父类是Activity,也就是说二者具有相同的接口和生命周期,同Activity一样,也有onCreate()、onPause()等函数可供我们重载。

在ActivityGroup的源码中有成员变量

protected LocalActivityManager mLocalActivityManager;

该变量在ActivityGroup的构造函数中创建并初始化,可见,ActivityGroup的功能实现肯定是要委托给这个对象来完成了。为了给用户开放对此对象的访问,ActivityGroup提供了

    public final LocalActivityManager getLocalActivityManager() {

        return mLocalActivityManager;

    }

通过浏览ActivityGroup的源码可以发现,几乎全部是以通过LocalActivityManager对象来完成的具体动作,比如:

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Bundle states = savedInstanceState != null

                ? (Bundle) savedInstanceState.getBundle(STATES_KEY) : null;

        mLocalActivityManager.dispatchCreate(states);

}

 

下面,我们就来看一下LocalActivityManager的源码。

在该类中,提供了一个私有类

    private static class LocalActivityRecord extends Binder {

        LocalActivityRecord(String _id, Intent _intent) {

            id = _id;

            intent = _intent;

        }

 

        final String id;                // Unique name of this record.

        Intent intent;                  // Which activity to run here.

        ActivityInfo activityInfo;      // Package manager info about activity.

        Activity activity;              // Currently instantiated activity.

        Window window;                  // Activity's top-level window.

        Bundle instanceState;           // Last retrieved freeze state.

        int curState = RESTORED;        // Current state the activity is in.

    }

用于保存Activity的信息,并提供了

    private final Map<String, LocalActivityRecord> mActivities

            = new HashMap<String, LocalActivityRecord>();

    private final ArrayList<LocalActivityRecord> mActivityArray

            = new ArrayList<LocalActivityRecord>();

采用这样的数据结构用于对所有嵌入的子Activity信息进行保存处理。其中前者用于通过String快速查找,后者用于以数组的方式快速访问,是典型的以空间换时间的的方式。

    public void dispatchCreate(Bundle state) {

        if (state != null) {

            final Iterator<String> i = state.keySet().iterator();

            while (i.hasNext()) {

                try {

                    final String id = i.next();

                    final Bundle astate = state.getBundle(id);

                    LocalActivityRecord r = mActivities.get(id);

                    if (r != null) {

                        r.instanceState = astate;

                    } else {

                        r = new LocalActivityRecord(id, null);

                        r.instanceState = astate;

                        mActivities.put(id, r);

                        mActivityArray.add(r);

                    }

                } catch (Exception e) {

……

                }

            }

        }

       

        mCurState = CREATED;

    }

从这里我们可以看出,当有一个ActivityGroup被Create的时候,就会有对应的Activity信息被保存到数组中。

当我们调用LocalActivityManager的startActivity()以产生Window的时候,我们也可以看到

public Window startActivity(String id, Intent intent) {

                   ……

        LocalActivityRecord r = mActivities.get(id);

        if (r == null) {

            r = new LocalActivityRecord(id, intent);

            adding = true;

        }

                   ……

        if (adding) {

            mActivities.put(id, r);

            mActivityArray.add(r);

        }

        ……

    }

有了这个数组,就可以遍历到ActivityGroup中嵌入的Activitys了,从而可以实现ActivityGroup的功能。

以上的分析结果产生的类图如下:

 

 

    ——欢迎转载,转载请注明出处,谢谢——


这篇关于Android源码学习之四-ActivityGroup是如何对嵌入的Activitys进行管理的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#