在服务中获取上下文


280

有没有任何可靠的方式来获得ContextService

我想为其注册一个广播接收器,ACTION_PHONE_STATE_CHANGED但是我不需要我的应用程序始终获取此信息,因此我不必将其放在中Manifest

但是,当我需要此信息时,我无法让广播接收器被GC杀死,因此我要将广播接收器注册到中Service

因此,我需要Context致电registerReceiver()。当我不再需要时,ACTION_PHONE_STATE_CHANGED我将其注销

有小费吗?

Answers:


780

3
我遇到了这个问题,但事实证明,它是没有上下文的工作线程。我在构造线程时通过传递上下文解决了该问题。
ctrl-alt-delor

17
注意:服务中的上下文直到服务中的onStart或onStartCommand才可见:stackoverflow.com/questions/7619917/…–

36
这可能是在stackoverflow中投票最高的最短答案
Sayka

4
考虑到答案的大小和收到的支持,我认为SO中没有其他答案能胜过这个了:)
Amruta-Pani

2
这4个字解决了我已经尝试解决3个小时的问题。
Nirup Iyer

64

Service延伸ContextWrapper延伸Context。因此,ServiceContext'this'在服务中使用关键字。


31
  1. Service 延伸 ContextWrapper
  2. ContextWrapper 延伸 Context

所以....

Context context = this;

(在服务或活动类别中)


8

由于ServiceContext,因此变量上下文必须为this

DataBaseManager dbm = Utils.getDataManager(this);   

5

由于服务本身已经是上下文

您甚至可以通过以下方式获得它:

Context mContext = this;

要么

Context mContext = [class name].this;  //[] only specify the class name
// mContext = JobServiceSchedule.this; 

1

以防万一有人得到NullPointerException,您需要获取上下文onCreate().

ServiceContext,因此请执行以下操作:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.