美文网首页Android开发之路别人的坑bug系列
接口代理实现Application多继承

接口代理实现Application多继承

作者: 程序员阿兵 | 来源:发表于2019-04-28 16:29 被阅读286次

在工作中碰到一个场景,就是你APP的Application是需要继承自家的Application,但是你在接入别人的SDK时,有的sdk接入要求你的Application继承他家的Application,这就比较尴尬了.Java只能单继承这可怎么是好?
接口代理就可以用上了.
首先我们让清单文件声明的Multiapplication继承代理类ProxyApplication,通过super.的方式在对用的生命周期中调用代理类的对应方法:

/** 
 * @author guiyanbing
 * @date :2019-4-28
 * @version 1.0
 * @parameter   使用接口代理实现application的多继承
 * @since 
 * @return  
 */
public class Multiapplication extends ProxyApplication {

    private static final String TAG = Multiapplication.class.getSimpleName();

    @Override
    public void attachBaseContext(Context base){
        super.attachBaseContext(base);
        Log.d(TAG, "attachBaseContext");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged");
    }

}

在代理类ProxyApplication 中我们通过反射和接口回调的方式调用实现类ImplementApplication的对应方法:

/** 
 * @author guiyanbing
 * @date :2019-4-28
 * @version 1.0
 * @parameter   使用接口代理实现application的多继承
 * @since 
 * @return  
 /
public class ProxyApplication extends Application {

    private IApplicationListener listener;


    @Override
    public void attachBaseContext(Context base){
        super.attachBaseContext(base);
        this.listener = initProxyApplication();
        if(this.listener != null){
            this.listener.onProxyAttachBaseContext(base);
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        if(listener != null){
            listener.onProxyCreate();
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(this.listener != null){
            this.listener.onProxyConfigurationChanged(newConfig);
        }
    }

    private IApplicationListener initProxyApplication() {
        try {
            Class clazz = Class.forName("cn.app.ImplementApplication");
            return (IApplicationListener)clazz.newInstance();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {

            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }
}

在实现类ImplementApplication中我们还是用接口回调加代理的方式来调用调用我们要继承的多个Appliction的生命周期方法:

/** 
 * @author guiyanbing
 * @date :2019-4-28
 * @version 1.0
 * @parameter   使用接口代理实现application的多继承
 * @since 
 * @return  
 */
public class ImplementApplication extends Application implements IApplicationListener {

    private IFishApplicationListener fishApplicationListener;
    private IEgameApplicationListener egameApplicationListener;


    @Override
    public void onProxyAttachBaseContext(Context base) {
        super.attachBaseContext(base);
        this.fishApplicationListener = initFishApplication();

        if(this.fishApplicationListener != null){
            this.fishApplicationListener.onFishAttachBaseContext(base);
        }

        this.egameApplicationListener = initEgameApplication();
        if(this.egameApplicationListener != null){
            this.egameApplicationListener.onEgameAttachBaseContext(base);
        }
    }

    @Override
    public void onProxyCreate() {
        super.onCreate();
        if (fishApplicationListener != null) {
            fishApplicationListener.onFishCreate();
        }

        if (egameApplicationListener != null) {
            egameApplicationListener.onEgameCreate();
        }
    }

    @Override
    public void onProxyConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(this.fishApplicationListener != null){
            this.fishApplicationListener.onFishConfigurationChanged(newConfig);
        }
        this.egameApplicationListener = initEgameApplication();

        if(this.egameApplicationListener != null){
            this.egameApplicationListener.onEgameConfigurationChanged(newConfig);
        }
    }

    private IFishApplicationListener initFishApplication() {
        try {
            Class clazz = Class.forName("cn.app.ImplementFishApplication");
            return (IFishApplicationListener)clazz.newInstance();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {

            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }

    private IEgameApplicationListener initEgameApplication() {
        try {
            Class clazz = Class.forName("cn.app.ImplementEgameApplication");
            return (IEgameApplicationListener)clazz.newInstance();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {

            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }
}


然后就到了最让我们兴奋的时候了,我们可以使用ImplementFishApplication和ImplementEgameApplication两个类来分别继承不同的Application

/** 
 * @author guiyanbing
 * @date :2019-4-28
 * @version 1.0
 * @parameter   使用接口代理实现application的多继承
 * @since 
 * @return  
 */
public class ImplementFishApplication extends FishApplication implements IFishApplicationListener {

    @Override
    public void onFishAttachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    @Override
    public void onFishCreate() {
        super.onCreate();
    }

    @Override
    public void onFishConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

}


public class ImplementEgameApplication extends EgameApplication implements IEgameApplicationListener {
    @Override
    public void onEgameCreate() {
        super.onCreate();
    }

    @Override
    public void onEgameAttachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    @Override
    public void onEgameConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }


}

至此我们只要将Multiapplication 声明在清单文件中就可以实现同时继承并跑EgameApplication 和FishApplication 的生命周期了,各SDK的初始化也一并得到运行.

public interface IEgameApplicationListener {

    public void onEgameCreate();

    public void onEgameAttachBaseContext(Context base);

    public void onEgameConfigurationChanged(Configuration newConfig);
}


public interface IFishApplicationListener {

    public void onFishHunterCreate();

    public void onFishHunterAttachBaseContext(Context base);

    public void onFishHunterConfigurationChanged(Configuration newConfig);
}


public interface IApplicationListener {
    public void onProxyCreate();

    public void onProxyAttachBaseContext(Context base);

    public void onProxyConfigurationChanged(Configuration newConfig);

}



相关文章

  • 接口代理实现Application多继承

    在工作中碰到一个场景,就是你APP的Application是需要继承自家的Application,但是你在接入别人...

  • Android_关于 Application 实现多继承

    使用接口代理的方式 定义一个代理的 ProxyApplication 继承 Application public...

  • 代理

    普通的动态代理可以继承实现方法实现super方法前后实现代理 动态代理的步骤①创建一个接口,目标类实现这个接口②创...

  • AOP底层实现:cglib动态代理

    一.与JDK动态代理的区别: jdk动态代理:基于接口,实现接口中相同的方法去实现的;cglib动态代理:父子继承...

  • java基础知识3-动态代理

    1. jdk动态代理原理 生成一个类A继承proxy实现要代理的接口(因为继承了proxy,所以只能代理接口了,j...

  • 多线程的三种实现方式、三种内部类写法、常见函数使用举例

    1、继承Thread类 2、实现Runnable接口(使用静态代理的方式实现的) 3、实现Callable接口 4...

  • JDK动态代理和CGLib代理

    JDK动态代理: (必须继承接口原因:生成的代理需要继承java.lang.reflect.Proxy类并实现被代...

  • Kotlin抽象类与接口 (2)✔️接口使用

    接口声明和实现接口与多继承接口继承接口中的具体函数和属性✔️同一函数继承多个实现的问题 比抽象类更加抽象的是接口,...

  • 第十三章接口

    Java中继承为单继承,只有一个父类 接口 特性 接口不能被实例化 实现类必须实现接口的所有方法 实现类可以实现多...

  • proxy

    1、静态代理 创建代理类 必要条件:1、代理、目标对象实现同样接口;2、代理类继承目标类 配置Bean 业务层 2...

网友评论

    本文标题:接口代理实现Application多继承

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