继承多个Application

在和CP对接接入SDK的过程中,因为接入了其他第三方SDK继承了其他的Application而Java是单继承所以没办法继承要求的其他SDK的Application,我们可以用接口代理的方式间接实现继承多个Application

比如我们要继承XApplication和YApplication,以下步骤进行

1、创建一个代理接口

/**@author gufra
 * 代理接口
 * */
public interface ApplicationListener {
    void appOnCreate();
    void appAttachBaseContext(Context context);
    void appOnConfigurationChanged(Configuration configuration);
}

2、实现代理接口的类

/**
 * @author gufra
 * 实现代理接口
 * */
public class ApplicationImpl extends Application implements ApplicationListener {
    private String TAG = "gufra.ApplicationImpl";
   
    @Override
    public void appOnCreate() {
        Log.d(TAG, "onCreate");
    }

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

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

3、创建一个代理类

/**
 * @author gufra
 * 代理类
 * */
public class ProxyApplication extends Application {
    ApplicationListener applicationListener = null;
    @Override
    public void onCreate() {
        super.onCreate();
        if (applicationListener != null) {
            applicationListener.appOnCreate();
        }
    }

    @Override
    public void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        applicationListener = getApplicationListener();
        if (applicationListener != null){
            applicationListener.appAttachBaseContext(context);
        }

    }

    @Override
    public void onConfigurationChanged(Configuration configuration) {
        super.onConfigurationChanged(configuration);
        if (applicationListener != null) {
            applicationListener.appOnConfigurationChanged(configuration);
        }
    }
//通过反射来进行代理
    private ApplicationListener getApplicationListener(){
        Class clazz = null;
        try {
            clazz = Class.forName("com.gufra.Application.Listeners.Impls.ApplicationImpl");
            return (ApplicationListener) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;

    }
}

4、创建需要继承的Application的代理接口(如果还有其他需要继承的Application,按照以下新建)

/**
 * @author gufra
 * XApplication代理接口
 * */
public interface XApplicationListener {
    void appOnCreate();
    void appAttachBaseContext(Context context);
    void appOnConfigurationChanged(Configuration configuration);
}
/**
 * @author gufra
 * YApplication代理接口
 * */
public interface YApplicationListener {
    void appOnCreate();
    void appAttachBaseContext(Context context);
    void appOnConfigurationChanged(Configuration configuration);
}

5、实现各个代理接口

/**
 * @author gufra
 * 实现XApplication代理接口
 * */
public class XApplicationImpl extends Application implements XApplicationListener {
    String TAG ="gufra.XApplicationImpl";
    @Override
    public void appOnCreate() {
        Log.d(TAG,"X->onCreate");
    }

    @Override
    public void appAttachBaseContext(Context context) {
        Log.d(TAG,"X->attachBaseContext");
    }

    @Override
    public void appOnConfigurationChanged(Configuration configuration) {
        Log.d(TAG,"X->onConfigurationChanged");
    }
}
/**
 * @author gufra
 * 实现YApplication代理接口
 * */
public class YApplicationImpl extends Application implements YApplicationListener {
    String TAG = "gufra.YApplicationImpl";
    @Override
    public void appOnCreate() {
        Log.d(TAG,"Y->onCreate");
    }

    @Override
    public void appAttachBaseContext(Context context) {
        Log.d(TAG,"Y->attachBaseContext");
    }

    @Override
    public void appOnConfigurationChanged(Configuration configuration) {
        Log.d(TAG,"Y->onConfigurationChanged");
    }
}

6、在实现代理接口类里加上各个Application的代理接口进行调用


/**
 * @author gufra
 * 实现代理接口
 * */
public class ApplicationImpl extends Application implements ApplicationListener {
    private String TAG = "gufra.ApplicationImpl";
    XApplicationListener xApplicationListener = null;
    YApplicationListener yApplicationListener= null;

    @Override
    public void appOnCreate() {
        Log.d(TAG, "onCreate");
        if (xApplicationListener != null){
            xApplicationListener.appOnCreate();
        }
        if (yApplicationListener != null){
            yApplicationListener.appOnCreate();
        }
    }

    @Override
    public void appAttachBaseContext(Context context) {
        Log.d(TAG, "attachBaseContext");
        xApplicationListener = getXApplication();
        yApplicationListener = getYApplication();
        if (xApplicationListener != null){
            xApplicationListener.appAttachBaseContext(context);
        }
        if (yApplicationListener != null){
            yApplicationListener.appAttachBaseContext(context);
        }
    }

    @Override
    public void appOnConfigurationChanged(Configuration configuration) {
        Log.d(TAG, "onConfigurationChanged");
        if (xApplicationListener != null){
            xApplicationListener.appOnConfigurationChanged(configuration);
        }
        if (yApplicationListener != null){
            yApplicationListener.appOnConfigurationChanged(configuration);
        }
    }

    private XApplicationListener getXApplication() {
        Class clazz = null;
        try {
            clazz = Class.forName("com.gufra.Application.Listeners.Impls.XApplicationImpl");
            return (XApplicationListener) clazz.newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    private YApplicationListener getYApplication(){
        Class clazz = null;
        try {
            clazz = Class.forName("com.gufra.Application.Listeners.Impls.YApplicationImpl");
            return (YApplicationListener) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }
}

7、在MyApplication继承ProxyApplica并且在AndroidManifest.xml里声明即可

public class MyApplication extends ProxyApplication {

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

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

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

<!--Manifest-->
<application
        android:name="com.gufra.MyApplication"
<!--此处省略-->
/>

8、日志输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gufra_Yin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值