如何从"extends Application"类创建目的,上下文为空



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

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

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.Interent.(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(ActivityThreads.java:518)

我很困惑,我可以用这个创建DatabaseManager fine。。

有什么想法吗?

对于Activity、Service、ContentProvider和Application,您不应该在构造函数中执行任何操作。当您知道对象已初始化并准备好使用时,首先应该做的工作是onCreate()。

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

如果您只是想进行一些首次初始化,我建议您不要使用Application。有一个可以在需要时检索的单例。然后在实际需要的时候进行初始化。不需要将其与服务相关联;你可以做一根线。使用服务的唯一原因是告诉系统"我的应用程序正忙于用户关心的后台工作,请尽量不要杀了我。"

用于需要维护全局应用程序状态的人员的基类。您可以提供自己的通过在AndroidManifest.xml的<应用程序>标记,当您的创建应用程序/包。

来源:http://developer.android.com/reference/android/app/Application.html

安卓开发者的强制关闭问题有四次是忘记修改安卓清单。(我完全编造了那个统计数字)。

Application扩展了Context,所以您应该能够通过它。

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

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

onCreate()中,确保调用super.onCreate()

最新更新