2

我有一个 extends 类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 at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) at android.content.ComponentName.(ComponentName.java:75) at android.content.Intent.(Intent.java:2551) at com .jameselsey.apps.cercademi.domain.GlobalState.(GlobalState.java:48) 在 java.lang.Class.newInstanceImpl(Native Method) 在 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)

我很困惑,我可以DatabaseManager用这个来创造罚款..

有任何想法吗?

4

3 回答 3

3

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

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

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

于 2011-06-26T03:26:51.310 回答
1

需要维护全局应用程序状态的基类。您可以通过在AndroidManifest.xml 的 <application> 标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的进程时为您实例化该类。

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

十分之四,Android 开发人员的强制关闭问题是忘记修改 Android 清单。(我完全编造了这个统计数据)。

Applicationextends Context,所以你应该能够通过它。

但是,扩展 Application 并不是最节省资源的方式。为了更简洁地解释它,这是同一页面的另一个引用:

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

于 2011-06-26T03:38:50.160 回答
0

onCreate(),确保你打电话super.onCreate()

于 2011-06-26T01:55:06.280 回答