SDK接入必备常识——认识Application对象
Application对象和我们之前说的Activity一样,也是android系统中的一个核心组件。当一个Android应用启动的时候,系统会创建一个Application对象来代表该应用。所以,可以看出Application对象和应用是一对一的,那也就是说,在同一个应用中,只可能有一个Application的实例存在
所以,很多时候,我们就可以在Application中存储一些共享数据,或者借助Application来完成多个Activity之间的数据传递。我们可以使用默认的Application,也可以自定义一个Application,然后通过在AndroidManifest.xml的application节点的name属性中设置下,则该应用被创建的时候,就会实例化该自定义的Application,而不是系统默认的Application。
在SDK接入过程中,我们发现,部分SDK是有自定义Application的。通常我们需要直接使用他们的自定义Application,但是如果我们应用里面也有自定义Application,那么我们还需要将我们的自定义Application继承他们的自定义Application。
因为U8SDK的设计,是需要彻底分离具体的SDK和游戏逻辑的解耦,所以,在U8SDK中,我们针对部分渠道SDK对Application的业务要求,增加了一种监听器模式。从而使得,游戏中不再需要关心具体SDK的Application需求,只需要直接使用U8Application或者继承U8Application即可。之前已经写过一篇博客详细说了设计思路,这里不再赘述。
我们通过U8Application来看看Application中都有哪些方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
package com.u8.sdk; import com.u8.sdk.utils.SDKTools; import android.app.Application; import android.content.Context; import android.content.res.Configuration; /** * 我们在u8sdk抽象层中,定义一个我们自己的Application实现类。在这个类中,我们主要是通过间接的调用 * IApplicationListener接口的方法来完成实际各个渠道Application中方法的调用。 * * 如果上层游戏,有自己的Application。那么可以让该Application继承U8Application即可。 * 如果没有,则可以直接将U8Application配置到应用的AndroidManifest.xml的application节点 * 的android:name属性中。 * * @author xiaohei * */ public class U8Application extends Application{ private static final String DEFAULT_PKG_NAME = "com.u8.sdk"; private static final String PROXY_NAME = "U8_APPLICATION_PROXY_NAME"; private IApplicationListener listener; public void onCreate(){ super.onCreate(); U8SDK.getInstance().setApplication(this); if(listener != null){ listener.onProxyCreate(); } } public void attachBaseContext(Context base){ super.attachBaseContext(base); U8SDK.getInstance().initAllConfigs(base); this.listener = initProxyApplication(); if(this.listener != null){ this.listener.onProxyAttachBaseContext(base); } } public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); if(this.listener != null){ this.listener.onProxyConfigurationChanged(newConfig); } } @SuppressWarnings("rawtypes") private IApplicationListener initProxyApplication(){ String proxyAppName = SDKTools.getMetaData(this, PROXY_NAME); if(proxyAppName == null || SDKTools.isNullOrEmpty(proxyAppName)){ return null; } if(proxyAppName.startsWith(".")){ proxyAppName = DEFAULT_PKG_NAME + proxyAppName; } try { Class clazz = Class.forName(proxyAppName); return (IApplicationListener)clazz.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } } |
可以看到,我们的U8Application继承了Application对象,同时重写了onCreate, attachBaseContext,onConfigurationChanged三个方法。
其中我们要知道:attachBaseContext首先执行然后才会执行onCreate方法。很多有自定义Application的渠道SDK,就是在attachBaseContext方法或者onCreate方法中进行了一些特殊化的操作。
最早之前U8SDK的初始化是放在Activity的onCreate方法中进行的,但是后来考虑到部分SDK的初始化需要放到Application的onCreate方法,而在U8SDK中,具体SDK的初始化参数又需要U8SDK统一读取,所以,我们只能将U8SDK的初始化放在Application的attachBaseContext方法中了。这样,可以保证U8SDK在具体的渠道SDK初始化之前就已经初始化完毕。
U8SDK的初始化也就是从assets目录下加载渠道配置参数,已经实例化具体的渠道SDK插件列表。所以,只要有了Context信息,我们就能够从assets目录下读取了。
关于Android中Context对象,也是一个非常重要又最容易被忽视的对象。关于Context的详细解说,可以看另一篇大声的博客:
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1559