文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android面试Intent采用的设计模式是什么

2023-07-05 09:39

关注

这篇文章主要介绍了Android面试Intent采用的设计模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android面试Intent采用的设计模式是什么文章都会有所收获,下面我们一起来看看吧。

正文

答案是采用了原型模式

原型模式的好处在于方便地拷贝某个实例的属性进行使用、又不会对原实例造成影响,其逻辑在于对 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采用的设计模式是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯