美文网首页Android开发经验谈Android进阶之路
浅谈安卓开发中context用到的装饰模式

浅谈安卓开发中context用到的装饰模式

作者: Android开发架构师 | 来源:发表于2020-12-06 22:21 被阅读0次

    一、UML图

    说明:Context类是最根部的抽象类,不实现具体的功能。Context类的具体实现实际上是在ContextImpl类,里面具体实现了startActivity()方法。Activity、Service都是继承自ContextWrapper,ContextWrapper持有ContextImpl的引用,是其余装饰类的基类。

    二、代码及相关说明

    2.1 Context接口

    publicabstractclassContext{//抽象类
        publicabstractvoidstartActivity(@RequiresPermissionIntentintent);//抽象方法
    //其他代码略
    } 
    

    Context实际上是个抽象类,里面定义了大量的抽象方法,其中就包含了startActivity()方法。伪代码中Context类仅包含基本的抽象方法,其余代码省略。

    2.2 ContextImpl类

    classContextImplextendsContext{
    
    @Override
        publicvoidstartActivity(Intentintent) {
        warnIfCallingFromSystemProcess();
        startActivity(intent,null);
       }
    @Override
        publicvoidstartActivity(Intentintent,Bundleoptions) {//
        warnIfCallingFromSystemProcess();
        if((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK)==0&&options!=null&&ActivityOptions.fromBundle(options).getLaunchTaskId()==-1) {
            thrownewAndroidRuntimeException("Calling startActivity() from outside of an Activity " + " context requires the FLAG_ACTIVITY_NEW_TASK flag." + " Is this really what you want?");
            }
        mMainThread.getInstrumentation().execStartActivity(getOuterContext(),mMainThread.getApplicationThread(),null,(Activity)null,intent,-1,options);
       }
    //其他代码略
    }
    

    ContextImpl类实现了Context类的具体实现,其中就包括startActivity()方法。

    2.3 ContextWrapper类

    publicclassContextWrapperextendsContext{//Context包装类
    
        ContextmBase;//持有Context引用
        publicContextWrapper(Contextbase) {//这里的base实际上就是ContextImpl
            mBase=base;
        }
        @Override
        publicvoidstartActivity(Intentintent) {
            mBase.startActivity(intent);//调用ContextImpl的startActivity()方法
         }
    //其他代码略
    }
    

    ContextWrapper类是装饰类的基类,持有Context引用。通常在Activity、Service里面调用startActivity()方法,实际上是调用他们的父类ContextWrapper里面的startActivity()方法。

    三、总结

    Context类充当了抽象组件的角色,ContextImpl类则是具体的组件,而ContextWrapper就是具体的装饰角色,通过扩展ContextWrapper增加不同的功能,就形成了Activity、Service等子类。

    最后

    在这里我分享自己收录整理的Android学习的PDF,里面对WebView有详细的讲解,希望可以帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,可以分享给身边好友一起学习

    如果你有需要的话,可以顺手点赞+评论,关注一波后点击Github】地址查看。

    Android 知识点汇总

    相关文章

      网友评论

        本文标题:浅谈安卓开发中context用到的装饰模式

        本文链接:https://www.haomeiwen.com/subject/ptvawktx.html