如何从“扩展应用程序”类创建一个intent,context为null

时间:2011-06-26 01:20:34

标签: android android-intent android-2.1-eclair

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

我想在我的应用程序启动时启动一个服务,所以在这个GlobalState类的构造函数中我尝试创建一个intent并启动一个服务,但我无法创建一个intent,因为我可以'抓住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.Intent。(Intent.java:2551)         在com.jameselsey.apps.cercademi.domain.GlobalState。(GlobalState.java:48)         at 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罚款..

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

  

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

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

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

Application扩展Context,因此您应该能够通过它。

但是,扩展应用程序并不是执行此操作的最具资源效率的方法。为了更简洁地解释它,这是来自同一页面的另一个引用:

  

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

答案 2 :(得分:0)

onCreate()中,请务必致电super.onCreate()