在服务中获取上下文

use*_*321 268 android broadcastreceiver android-service

有没有可靠的方法来获得Context一个Service

我想注册广播接收器,ACTION_PHONE_STATE_CHANGED但我不需要我的应用程序总是得到这些信息,所以我不把它放在Manifest.

但是,当我需要这些信息时,我不能让GC杀死广播接收器,因此我正在注册广播接收器Service.

因此,我需要一个Context来打电话registerReceiver().当我不再需要时,ACTION_PHONE_STATE_CHANGED取消注册它.

有小费吗?

mib*_*lma 751

服务是一种语境

  • 这可能是stackoverflow中投票率最高的最短答案 (31认同)
  • 注意:在服务中的onStart或onStartCommand之前,服务中的上下文将不可见:http://stackoverflow.com/questions/7619917/how-to-get-context-in-android-service-class (17认同)
  • 考虑到答案的大小和收到的upvotes,我不认为在SO中的任何其他答案击败这:) (4认同)
  • 我有这个问题,但结果是工作线程没有上下文.我解决了它在构造线程时传递上下文的问题. (3认同)
  • 这四个字解决了我已经尝试解决3个小时的问题。 (2认同)

use*_*983 59

Service扩展ContextWrapper延伸Context.因此Service是一个Context.'this'在服务中使用关键字.


Har*_*era 29

  1. Service 扩展 ContextWrapper
  2. ContextWrapper 扩展 Context

所以....

Context context = this;
Run Code Online (Sandbox Code Playgroud)

(在服务或活动类中)


Jor*_*sys 6

由于Service是a Context,变量上下文必须是this:

DataBaseManager dbm = Utils.getDataManager(this);   
Run Code Online (Sandbox Code Playgroud)


Ecc*_*nda 6

以防万一有人得到NullPointerException,你需要得到里面的上下文onCreate().

Service是 a Context,所以这样做:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Run Code Online (Sandbox Code Playgroud)


Ali*_*lam 5

因为Service本身已经是一个Context

你甚至可以通过:

Context mContext = this;
Run Code Online (Sandbox Code Playgroud)

或者

Context mContext = [class name].this;  //[] only specify the class name
// mContext = JobServiceSchedule.this; 
Run Code Online (Sandbox Code Playgroud)