我有一个扩展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
罚款..
有什么想法吗?
答案 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()
。