在Android项目库中扩展Application类?

6
我有一个项目(在Eclipse中),我将其转换为Android项目库,以便在另一个类似的项目中重复使用一些代码。然而,我认为我已经自己给自己挖了一个坑,因为我遇到了以下错误:

Unable to start activity ComponentInfo{com.test.scroller1/com.lib.scrolltest.ScrollTestActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to com.lib.scrolltest.resAppVars

com.lib.scrolltest是我的项目库,它实例化了一个扩展Application的类(resAppVars)。在onCreate()方法中,我调用:

mRav = (resAppVars) getApplicationContext ();

这样,我就可以使用mRav对象中的方法,否则在其他类中会出现大量重复的代码(例如传递查询到通用选择语句,返回结果的ArrayList)。

问题在哪里?看起来我已经达到了实现Application类的限制。

2个回答

4
调用getApplicationContext()方法会返回当前应用程序的Application对象(即拥有onCreate()方法的活动所属的应用程序)。
除非你在进行一些奇怪的操作,否则你无法选择使用哪个Application类。甚至在Application文档中也有一条注释提示不要这样做:

通常情况下,没有必要子类化Application类。在大多数情况下, 静态单例可以以更模块化的方式提供相同的功能。 如果您的单例需要全局上下文(例如注册广播接收器),则可以为检索它的函数提供一个 Context参数,该参数在首次构建单例时内部使用Context.getApplicationContext()方法。

你应该在库项目中创建一个普通的共享类。或者如果你不需要库项目提供的特殊功能,也可以使用一个普通的.jar文件。
如果需要共享状态,请将其设置为单例。;)

谢谢,但在Android中静态变量(单例)并不是最好的方式。在应用程序生命周期的某些实例中,静态变量可能会被初始化为默认值。https://dev59.com/BnE95IYBdhLWcg3wDpqg http://electronicvendor.com/using-static-variables-in-android/ 不过,我很感激您抽出时间来回答。 - wufoo
1
据我所知,单例将存在于您的应用程序进程的生命周期中。该进程的生存期至少与应用程序中的任何未销毁组件(活动、服务等)一样长。 - Trevor Johns
@wufoo 我仍然不明白为什么静态单例是不好的。我的意思是,Android文档本身建议使用它们而不是子类化Application类。它怎么会这么糟糕呢? - IgorGanapolsky
2
事实证明,关于静态变量(单例)存在一些分歧。有人说好,有人说不好。正如Igor所提到的,Android文档确实推荐使用静态变量。对于那些新手来说,要注意静态变量通常被视为不良实践,因为它们可以在应用程序内的任何地方进行修改。这完全破坏了模块化编程设计的概念,并且几乎总是会成为维护的头疼问题。 - wufoo
1
我尽量避免使用静态对象,因为如果你有Java背景,你会认为这些静态对象在应用程序生命周期中将永远存在;然而,在Android应用程序中使用时,系统可能会在应用程序处于后台且设备内存不足时删除您的静态对象。问题在于它可以释放静态类,但有时会将最后一个活动留在内存中;当用户打开应用程序时,最后一个活动运行,但静态对象不再存在,因此很容易导致崩溃。因此,请小心并尝试在您的单例代码中防止这种情况发生。 - htafoya

3
尽管这是一个很老的帖子,但我遇到了同样的问题并解决了它。因此,我想为大家发布解决方案。 事实证明,我忘记在清单文件中声明子类应用程序名称。 android:name 应该指向扩展应用程序类,即使它在引用库中定义。
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="com.example.lib.MyApp">

在我添加了这个之后,我可以在项目的任何地方使用扩展应用程序与 (<cast>) getApplication() 一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接