0
点赞
收藏
分享

微信扫一扫

Android 系列 2.3将Android应用程序对象访问为“Singleton”


2.3将Android应用程序对象访问为“Singleton”

问题
您需要从Android应用中访问“全局”数据。

最好的解决方案是将android.app.Application子类化,并将其视为具有静态访问器的单例。每个Android应用程序保证在应用程序的生命周期只有一个android.app.Application实例。如果你选择子类化android.app.Application,Android将创建你的类的实例,并调用android.app.Application生命周期方法。因为没有什么阻止你创建你的子类android.app.Application的另一个实例,它不是一个真正的单身,但它足够接近。
具有全局可访问的对象如会话处理程序,Web服务网关或任何您的应用程序只需要一个实例的对象,将大大简化您的代码。有时,这些对象可以实现为单例,有时它们不能,因为它们需要一个Context实例来进行正确的初始化。在任何一种情况下,将静态访问器添加到您的子类android.app.Application实例中,以便您可以在一个位置合并所有可全局访问的数据,保证访问Context实例,并且轻松地写入“正确”单例代码,不必担心同步。
讨论
在编写Android应用程序时,您可能会发现有必要在多个活动中共享数据和服务。例如,如果您的应用包含会话数据(例如当前登录的用户),则您可能希望公开此信息。当在Android平台上开发时,解决此问题的模式是让您的android.app.Application实例拥有所有全局数据,然后将您的Application实例作为具有静态访问器的单例对待各种数据和服务。
在撰写Android应用程式时,您只能保留一个android.app.Application类别的实例,因此Google Play小组(建议由Google Android小组推荐)将其视为单身人士。也就是说,您可以安全地向应用程序实现添加静态getInstance()方法。实施例2-2提供了一个实施例。
实施例2-2。应用程序实现

public class AndroidApplication extends Application {
private static AndroidApplication sInstance;private SessionHandler sessionHandler; // Generic your-application handler
public static AndroidApplication getInstance() {
return sInstance;
}
public Session Handler getSessionHandler()
return sessionHandler;
}
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
sInstance.initializeInstance();
}
protected void initializeInstance() {
// do all your initialization here
sessionHandler = new SessionHandler(
this.getSharedPreferences( "PREFS_PRIVATE", Context.MODE_PRIVATE ) );
}
}

这不是经典的单例实现,但是考虑到Android框架的限制,这是我们最近的事情,它是安全的,它的工作原理。
在这个应用程序中使用这种技术简化和清理了实现。
此外,它使开发测试更容易。 结合Robolectric测试框架使用此技术,您可以直接模拟整个执行环境。
此外,不要忘记将应用程序声明添加到AndroidManifest.xml文件中:

<application android:icon =“@ drawable / app_icon”
android:label =“@ string / app_name”
android:name =“com.newton.sergeycao.AbcApplication”>

举报

相关推荐

0 条评论