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

其他教程   发布日期:2023年08月08日   浏览次数:502

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

    正文

    答案是采用了原型模式

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

    1. Cloneable
    接口的实现。

    Intent 的关键源码

    1. // frameworks/base/core/java/android/content/Intent.java
    2. public class Intent implements Parcelable, Cloneable {
    3. ...
    4. private static final int COPY_MODE_ALL = 0;
    5. private static final int COPY_MODE_FILTER = 1;
    6. private static final int COPY_MODE_HISTORY = 2;
    7. @Override
    8. public Object clone() {
    9. return new Intent(this);
    10. }
    11. public Intent(Intent o) {
    12. this(o, COPY_MODE_ALL);
    13. }
    14. private Intent(Intent o, @CopyMode int copyMode) {
    15. this.mAction = o.mAction;
    16. this.mData = o.mData;
    17. this.mType = o.mType;
    18. this.mIdentifier = o.mIdentifier;
    19. this.mPackage = o.mPackage;
    20. this.mComponent = o.mComponent;
    21. this.mOriginalIntent = o.mOriginalIntent;
    22. ...
    23. if (copyMode != COPY_MODE_FILTER) {
    24. ...
    25. if (copyMode != COPY_MODE_HISTORY) {
    26. ...
    27. }
    28. }
    29. }
    30. ...
    31. }

    可以看到

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

    默认的拷贝策略是

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

    无视启动 flag、bundle 等数据

    1. // frameworks/base/core/java/android/content/Intent.java
    2. public class Intent implements Parcelable, Cloneable {
    3. ...
    4. public @NonNull Intent cloneFilter() {
    5. return new Intent(this, COPY_MODE_FILTER);
    6. }
    7. private Intent(Intent o, @CopyMode int copyMode) {
    8. this.mAction = o.mAction;
    9. ...
    10. if (copyMode != COPY_MODE_FILTER) {
    11. this.mFlags = o.mFlags;
    12. this.mContentUserHint = o.mContentUserHint;
    13. this.mLaunchToken = o.mLaunchToken;
    14. ...
    15. }
    16. }
    17. }

    中拷贝策略是 COPY_MODE_HISTORY

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

    1. // frameworks/base/core/java/android/content/Intent.java
    2. public class Intent implements Parcelable, Cloneable {
    3. ...
    4. public Intent maybeStripForHistory() {
    5. if (!canStripForHistory()) {
    6. return this;
    7. }
    8. return new Intent(this, COPY_MODE_HISTORY);
    9. }
    10. private Intent(Intent o, @CopyMode int copyMode) {
    11. this.mAction = o.mAction;
    12. ...
    13. if (copyMode != COPY_MODE_FILTER) {
    14. ...
    15. if (copyMode != COPY_MODE_HISTORY) {
    16. if (o.mExtras != null) {
    17. this.mExtras = new Bundle(o.mExtras);
    18. }
    19. if (o.mClipData != null) {
    20. this.mClipData = new ClipData(o.mClipData);
    21. }
    22. } else {
    23. if (o.mExtras != null && !o.mExtras.isDefinitelyEmpty()) {
    24. this.mExtras = Bundle.STRIPPED;
    25. }
    26. }
    27. }
    28. }
    29. }

    总结起来:

    Copy Mode action 等数据 flags 等数据 bundle 等历史
    COPY_MODE_ALL YES YES YES
    COPY_MODE_FILTER YES NO NO
    COPY_MODE_HISTORY YES YES NO

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

    除了

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

    1. Bundle
    也实现了 clone(),提供了 new Bundle(this) 的处理:
    1. public final class Bundle extends BaseBundle implements Cloneable, Parcelable {
    2. ...
    3. @Override
    4. public Object clone() {
    5. return new Bundle(this);
    6. }
    7. }

    组件信息类

    1. ComponentName
    也在 clone() 中提供了类似的实现:
    1. public final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> {
    2. ...
    3. public ComponentName clone() {
    4. return new ComponentName(mPackage, mClass);
    5. }
    6. }

    工具类

    1. IntArray
    亦是如此:
    1. public class IntArray implements Cloneable {
    2. ...
    3. @Override
    4. public IntArray clone() {
    5. return new IntArray(mValues.clone(), mSize);
    6. }
    7. }

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

    1. Bitmap
    没有实现该接口但提供了
    1. copy()
    ,内部将传递原始 Bitmap 在 native 中的对象指针并伴随目标配置进行新实例的创建:
    1. public final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> {
    2. ...
    3. public Bitmap copy(Config config, boolean isMutable) {
    4. ...
    5. noteHardwareBitmapSlowCall();
    6. Bitmap b = nativeCopy(mNativePtr, config.nativeInt, isMutable);
    7. if (b != null) {
    8. b.setPremultiplied(mRequestPremultiplied);
    9. b.mDensity = mDensity;
    10. }
    11. return b;
    12. }
    13. }

    以上就是Android面试Intent采用的设计模式是什么的详细内容,更多关于Android面试Intent采用的设计模式是什么的资料请关注九品源码其它相关文章!