返回顶部
首页 > 资讯 > 移动开发 >Android面试Intent采用了什么设计模式解析
  • 230
分享到

Android面试Intent采用了什么设计模式解析

Android面试Intent设计模式Android面试AndroidIntent 2023-03-06 09:03:10 230人浏览 泡泡鱼
摘要

目录正文Intent 的关键源码无视启动 flag、bundle 等数据中拷贝策略是 COPY_MODE_HISTORYAndroid 源码中还有很多地方采用了原型模式正文 答案是采

正文

答案是采用了原型模式

原型模式的好处在于方便地拷贝某个实例的属性进行使用、又不会对原实例造成影响,其逻辑在于对 Cloneable 接口的实现。

Intent 的关键源码

 // frameworks/base/core/java/android/content/Intent.java
 public class Intent implements Parcelable, Cloneable {
     ...
     private static final int COPY_MODE_ALL = 0;
     private static final int COPY_MODE_FILTER = 1;
     private static final int COPY_MODE_HISTORY = 2;
 ​
     @Override
     public Object clone() {
         return new Intent(this);
     }
 ​
     public Intent(Intent o) {
         this(o, COPY_MODE_ALL);
     }
 ​
     private Intent(Intent o, @CopyMode int copyMode) {
         this.Maction = o.mAction;
         this.mData = o.mData;
         this.mType = o.mType;
         this.mIdentifier = o.mIdentifier;
         this.mPackage = o.mPackage;
         this.mComponent = o.mComponent;
         this.mOriginalIntent = o.mOriginalIntent;
         ...
 ​
         if (copyMode != COPY_MODE_FILTER) {
             ...
             if (copyMode != COPY_MODE_HISTORY) {
                 ...
             }
         }
     }
     ...
 }

可以看到 Intent 实现的 clone() 逻辑是直接调用了 new 并传入了自身实例,而非调用 super.clone() 进行拷贝。

默认的拷贝策略是 COPY_MODE_ALL,顾名思义,将完整拷贝源实例的所有属性进行构造。其他的拷贝策略是 COPY_MODE_FILTER 指的是只拷贝跟 Intent-filter 相关的属性,即用来判断启动目标组件的 action、data、type、component、cateGory 等必备信息。

无视启动 flag、bundle 等数据

 // frameworks/base/core/java/android/content/Intent.java
 public class Intent implements Parcelable, Cloneable {
     ...
     public @NonNull Intent cloneFilter() {
         return new Intent(this, COPY_MODE_FILTER);
     }
 ​
     private Intent(Intent o, @CopyMode int copyMode) {
         this.mAction = o.mAction;
         ...
 ​
         if (copyMode != COPY_MODE_FILTER) {
             this.mFlags = o.mFlags;
             this.mContentUserHint = o.mContentUserHint;
             this.mLaunchToken = o.mLaunchToken;
             ...
         }
     }
 }

中拷贝策略是 COPY_MODE_HISTORY

不需要 bundle 等历史数据,保留 action 等基本信息和启动 flag 等数据。

 // frameworks/base/core/java/android/content/Intent.java
 public class Intent implements Parcelable, Cloneable {
     ...
     public Intent maybeStripForHistory() {
         if (!canStripForHistory()) {
             return this;
         }
         return new Intent(this, COPY_MODE_HISTORY);
     }
 ​
     private Intent(Intent o, @CopyMode int copyMode) {
         this.mAction = o.mAction;
         ...
 ​
         if (copyMode != COPY_MODE_FILTER) {
             ...
             if (copyMode != COPY_MODE_HISTORY) {
                 if (o.mExtras != null) {
                     this.mExtras = new Bundle(o.mExtras);
                 }
                 if (o.mClipData != null) {
                     this.mClipData = new ClipData(o.mClipData);
                 }
             } else {
                 if (o.mExtras != null && !o.mExtras.isDefinitelyEmpty()) {
                     this.mExtras = Bundle.STRIPPED;
                 }
             }
         }
     }
 }

总结起来:

Copy Modeaction 等数据flags 等数据bundle 等历史
COPY_MODE_ALLYESYESYES
COPY_MODE_FILTERYESNONO
COPY_MODE_HISTORYYESYESNO

Android 源码中还有很多地方采用了原型模式

除了 Intent,Android 源码中还有很多地方采用了原型模式。

Bundle 也实现了 clone(),提供了 new Bundle(this) 的处理:

 public final class Bundle extends BaseBundle implements Cloneable, Parcelable {
     ...
     @Override
     public Object clone() {
         return new Bundle(this);
     }
 }

组件信息类 ComponentName 也在 clone() 中提供了类似的实现:

 public final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> {
     ...
     public ComponentName clone() {
         return new ComponentName(mPackage, mClass);
     }
 }

工具IntArray 亦是如此:

 public class IntArray implements Cloneable {
     ...
     @Override
     public IntArray clone() {
         return new IntArray(mValues.clone(), mSize);
     }
 }

原型模式也不一定非得实现 Cloneable,提供了类似的实现即可。比如:

Bitmap 没有实现该接口但提供了 copy(),内部将传递原始 Bitmap 在 native 中的对象指针并伴随目标配置进行新实例的创建:

 public final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> {
     ...
     public Bitmap copy(Config config, boolean isMutable) {
         ...
         noteHardwareBitmapSlowCall();
         Bitmap b = nativeCopy(mNativePtr, config.nativeInt, isMutable);
         if (b != null) {
             b.setPremultiplied(mRequestPremultiplied);
             b.mDensity = mDensity;
         }
         return b;
     }
 }

以上就是Android面试Intent采用了什么设计模式解析的详细内容,更多关于Android面试Intent设计模式的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android面试Intent采用了什么设计模式解析

本文链接: https://lsjlt.com/news/198532.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android面试Intent采用了什么设计模式解析
    目录正文Intent 的关键源码无视启动 flag、bundle 等数据中拷贝策略是 COPY_MODE_HISTORYAndroid 源码中还有很多地方采用了原型模式正文 答案是采...
    99+
    2023-03-06
    Android面试Intent设计模式 Android面试 Android Intent
  • Android面试Intent采用的设计模式是什么
    这篇文章主要介绍了Android面试Intent采用的设计模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android面试Intent采用的设计模式是什么文章都会有所收获,下面我们一起来看看吧。正文答...
    99+
    2023-07-05
  • Android设计模式之单例模式解析
    在日常开发过程中时常需要用到设计模式,但是设计模式有23种,如何将这些设计模式了然于胸并且能在实际开发过程中应用得得心应手呢?和我一起跟着《Android源码设计模式解析与实战》一书边学边应用吧!今天我们要讲的是单例模式定义确保某一个类只有...
    99+
    2023-05-30
    android 单例模式 之单
  • 解析Golang的面向对象设计模式
    Golang(也称为Go语言)是由Google开发的一种编程语言,它在面向对象编程方面有自己独特的设计模式。在本篇文章中,我们将探讨Golang中常用的面向对象设计模式,并提供具体的代...
    99+
    2024-02-28
    golang 设计模式 面向对象 go语言
  • Android常用设计模式之原型模式详解
    目录前言一、基本使用二、对象与集合的使用三、浅拷贝与深拷贝四、Kotlin的应用总结前言 什么是原型模式? 它是指创建对象的种类,并通过拷贝这些原型创建新的对象。 它是用于创建重复的...
    99+
    2022-11-13
    Android 设计模式原型模式 Android 原型模式
  • PHP面向对象编程:设计模式全面解析
    设计模式是可重用的编程解决方案,用于解决常见问题,尤其有利于面向对象编程。创建型:工厂方法(创建对象)、抽象工厂(创建相关对象);结构型:适配器(转换接口)、装饰器(动态添加功能);行为...
    99+
    2024-05-10
    php 面向对象 php面向对象编程
  • Android设计模式之策略模式怎么使用
    本篇内容主要讲解“Android设计模式之策略模式怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android设计模式之策略模式怎么使用”吧!1、收到需求假设我们需要自定义的 View ...
    99+
    2023-07-05
  • 详解Python为什么不用设计模式
    前言 刚刚看了EuroPython 2017一篇演讲,Why You Don't Need Design Patterns in Python,为什么python不用设计模式。演讲者...
    99+
    2024-04-02
  • Android设计模式之适配器模式怎么使用
    适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的类能够一起工作,通过创建一个适配器类...
    99+
    2023-08-14
    Android
  • 工作中的设计模式门面模式是什么意思
    这篇文章主要介绍“工作中的设计模式门面模式是什么意思”,在日常操作中,相信很多人在工作中的设计模式门面模式是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”工作中的设计...
    99+
    2024-04-02
  • Android设计模式SOLID六大原则是什么
    本篇内容主要讲解“Android设计模式SOLID六大原则是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android设计模式SOLID六大原则是什么”吧!单一职责原则定义定义:确保单例类...
    99+
    2023-06-25
  • 设计模式系列之什么是解释器模式
    本篇内容主要讲解“设计模式系列之什么是解释器模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“设计模式系列之什么是解释器模式”吧! 模式定义给分析对象...
    99+
    2024-04-02
  • php设计模式中工厂模式有什么用
    这篇文章将为大家详细讲解有关php设计模式中工厂模式有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用工厂模式的目的或目标?工厂模式的最大优点在于创建对象上面,就...
    99+
    2024-04-02
  • Java设计模式中单件模式有什么用
    小编给大家分享一下Java设计模式中单件模式有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!定义单件模式确保一个类只有一个实例,并提供一个全局访问点Java单件模式经典单件模式的实现public class...
    99+
    2023-06-25
  • Java设计模式解析之适配器模式怎么实现
    本篇内容介绍了“Java设计模式解析之适配器模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是适配器模式:适配器模式主要用...
    99+
    2023-06-30
  • web设计模式的适配器模式有什么用
    本文小编为大家详细介绍“web设计模式的适配器模式有什么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“web设计模式的适配器模式有什么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。意图将一个类的接口转换成客...
    99+
    2023-06-19
  • JavaScript5大常用设计模式是什么
    本篇内容主要讲解“JavaScript5大常用设计模式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript5大常用设计模式是什么”吧!设计模...
    99+
    2024-04-02
  • PHP 设计模式解惑:从工厂到单例,全面剖析
    php 设计模式用于解决常见问题,提供灵活性、可扩展性和可维护性。它们包括:工厂模式:通过工厂类创建对象,简化对象的创建过程。建造者模式:分步建造复杂对象,允许在不影响表示的情况下独立改...
    99+
    2024-05-09
    php 设计模式
  • 实例解析Python设计模式编程之桥接模式的运用
    我们先来看一个例子: #encoding=utf-8 # #by panda #桥接模式 def printInfo(info): print unicode(info, 'utf-...
    99+
    2022-06-04
    模式 实例 桥接
  • 剖析JavaScript MVC架构:深入了解MVC设计模式的精髓
    MVC架构概述 MVC架构是一种设计模式,它将应用程序的逻辑分为三个部分:模型、视图和控制器。模型负责应用程序的数据和业务逻辑,视图负责显示数据,控制器负责处理用户交互。MVC架构使应用程序更易于维护和扩展,因为它使开发人员能够独立地修改...
    99+
    2024-02-12
    JavaScript MVC 模型 视图 控制器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作