รับบริบทในบริการ


280

มีวิธีที่เชื่อถือได้ในการได้รับContextจากService?

ฉันต้องการที่จะลงทะเบียนรับออกอากาศACTION_PHONE_STATE_CHANGEDแต่ฉันไม่จำเป็นต้อง app Manifestของฉันเสมอได้รับข้อมูลนี้ดังนั้นฉันไม่ได้ใส่ไว้ใน

แต่ผมไม่สามารถมีตัวรับสัญญาณการออกอากาศจะถูกฆ่าโดย GC Serviceเมื่อฉันต้องใช้ข้อมูลนี้ดังนั้นฉันลงทะเบียนรับการออกอากาศใน

ดังนั้นฉันต้องการที่จะต่อการเรียกร้องContext registerReceiver()เมื่อฉันไม่ต้องการACTION_PHONE_STATE_CHANGEDฉันจะยกเลิกการลงทะเบียน

เคล็ดลับใด ๆ

คำตอบ:


781

3
ฉันมีปัญหานี้ แต่ปรากฎว่าเป็นเธรดของผู้ปฏิบัติงานที่ไม่มีบริบท ฉันแก้ไขมันโดยผ่านบริบทเมื่อสร้างเธรด
ctrl-alt-delor

17
หมายเหตุ: บริบทภายในบริการจะไม่สามารถมองเห็นได้จนกว่า onStart หรือ onStartCommand ในบริการ: stackoverflow.com/questions/7619917//
คลาส

36
นี่อาจเป็นคำตอบที่สั้นที่สุดที่มีคะแนนโหวตสูงสุดในการ
ซ้อนทับ

4
เมื่อพิจารณาถึงขนาดของคำตอบและจำนวน upvotes ที่ได้รับฉันไม่คิดว่าจะมีคำตอบอื่นใดใน SO นี้ :) :)
Amruta-Pani

2
4 คำเหล่านี้เพิ่งแก้ปัญหาของฉันที่ฉันพยายามแก้อยู่ 3 ชั่วโมง
Nirup Iyer

64

Serviceขยายซึ่งทอดตัวContextWrapper Contextดังนั้นเป็นService Contextใช้'this'คำสำคัญในบริการ


31
  1. Service ขยาย ContextWrapper
  2. ContextWrapper ขยาย Context

ดังนั้น....

Context context = this;

(ในการบริการหรือชั้นเรียนกิจกรรม)


8

เนื่องจากServiceเป็น a Contextบริบทของตัวแปรต้องเป็น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().

Serviceคือ a Contextให้ทำสิ่งนี้:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.