Android 如何从“文件”中创建意图;“扩展应用程序”;类,上下文为空

Android 如何从“文件”中创建意图;“扩展应用程序”;类,上下文为空,android,android-intent,android-2.1-eclair,Android,Android Intent,Android 2.1 Eclair,我有一个扩展了android.app.Application的类,我用它来保存应用程序周围的全局状态 我想在应用程序启动时启动服务,因此在这个GlobalState类的构造函数中,我尝试创建一个意图并启动一个服务,但我无法创建意图,因为我无法获得上下文 public GlobalState() { Log.d(this.getClass().getSimpleName(), "Initialise DatabaseManager"); dbManager = new Databa

我有一个扩展了android.app.Application的类,我用它来保存应用程序周围的全局状态


我想在应用程序启动时启动服务,因此在这个
GlobalState
类的构造函数中,我尝试创建一个意图并启动一个服务,但我无法创建意图,因为我无法获得
上下文

public GlobalState() {
    Log.d(this.getClass().getSimpleName(), "Initialise DatabaseManager");
    dbManager = new DatabaseManager(this);

    Log.d(this.getClass().getSimpleName(), "Requesting start up of ContactsUpdater Service");
    Intent i = new Intent(this, ContactsUpdater.class);
    startService(i);
}
我尝试使用
getApplicationContext()
,但这会引发空指针异常

java.lang.NullPointerException 位于android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) 位于android.content.ComponentName。(ComponentName.java:75) 位于android.content.Intent.(Intent.java:2551) 位于com.jameselsey.apps.cercademi.domain.GlobalState.(GlobalState.java:48) 位于java.lang.Class.newInstanceImpl(本机方法) 位于java.lang.Class.newInstance(Class.java:1479) 位于android.app.Instrumentation.newApplication(Instrumentation.java:957) 位于android.app.Instrumentation.newApplication(Instrumentation.java:942) 在android.app.ActivityThread$PackageInfo.makeApplication上(ActivityThread.java:518)

我很困惑,我可以用这个来创建
数据库管理器


有什么想法吗?

onCreate()
中,确保调用
super.onCreate()
对于活动、服务、内容提供者和应用程序,您不应该在构造函数中执行任何操作。当您知道对象已初始化并准备好使用时,您应该首先在onCreate()中进行工作


此外,请再次考虑“我想在应用程序启动时启动一个服务。”这里的代码所做的是在进程启动时尝试启动一个服务。我真的不认为你想要那样。您希望启动此服务,因为您碰巧在后台接收到广播

若你们只是想做一些首次初始化,我的建议是根本不要使用这个应用程序。有一个可以在需要时检索的单例。然后init发生在实际需要的点上。不需要将其与服务相关联;你可以做一根线。使用服务的唯一原因是告诉系统“我的应用正在忙着做用户关心的后台工作,请不要杀了我。”

用于需要维护全局应用程序状态的基类。你可以自己提供 通过在您的AndroidManifest.xml中指定其名称来实现

十次中有四次,Android开发者的强制关闭问题是忘记修改Android清单。(这个统计数字完全是我编造的)

应用程序
扩展了
上下文
,因此您应该能够传递它

然而,扩展应用程序并不是实现这一点的最节省资源的方法。为了更简洁地解释这一点,下面是同一页的另一句话:

通常不需要对应用程序进行子类化。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),则可以为检索该上下文的函数提供一个上下文,该上下文在首次构造单例时在内部使用context.getApplicationContext()


“我想在应用程序启动时启动一项服务”——我怀疑您的用户是否希望您这样做。任务杀手和设置中的强制停止功能之所以出现,是因为开发人员错误地使用了服务,我敢打赌“
数据库管理器”
”不需要是一项服务,更不用说“当我的应用程序启动时”运行的服务了(无论这个概念在Android中意味着什么)。@commonware当我的应用程序启动时,我想从一个SQLite实例中读取一些细节,然后使用GeocodeAPI,这两个任务都可能耗时。我想创建一个在启动屏幕之前启动的服务,这样可以说它有几秒钟的时间来领先。您能提出更好的方法吗?让启动屏幕启动
IntentService