我有一个项目(在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是我的项目库,它实例化一个扩展应用程序的类(resAppVars)。在onCreate()方法中,我调用:
mRav = (resAppVars) getApplicationContext ();
这样,我可以使用mRav对象中的方法,否则在其他类中会有很多重复的代码(例如将查询传递给返回结果的ArrayList的泛型select语句。)
这里有什么问题?看来我在实现Application类的方式上遇到了限制。
答案 0 :(得分:4)
调用getApplicationContext()返回当前应用程序的Application对象(即拥有onCreate()
正在其中运行的活动的应用程序。)
除非你做了一些奇怪的事情,否则你不会选择使用哪个Application类。 Application的文档中甚至还有一条说明不要这样做的说明:
通常不需要子类Application。在大多数情况下, 静态单例可以在更模块化的情况下提供相同的功能 办法。如果您的单身人士需要全局上下文(例如注册 广播接收器),可以给出一个检索它的功能 内部使用Context.getApplicationContext()的Context 首先构建单身人士。
您应该只在库项目中创建一个常规共享类。或者,如果您不需要库项目提供的特殊功能,您也可以使用常规.jar文件。
如果您需要共享状态,只需将其设为单身。 ;)
答案 1 :(得分:3)
虽然这是一篇非常古老的帖子。我遇到了同样的问题并解决了它。所以我想我会为每个人发布解决方案。
事实证明,我忘了在清单文件中声明子类应用程序名称。
android:name
应该指向扩展的app类,即使它是在引用的库中定义的。
<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()
的扩展应用。