在和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、日志输出