Nhận bối cảnh trong một dịch vụ


280

Có cách nào đáng tin cậy để có được một Contexttừ Service?

Tôi muốn đăng ký một máy thu quảng bá ACTION_PHONE_STATE_CHANGEDnhưng tôi không cần ứng dụng của mình để luôn nhận được thông tin này, vì vậy tôi không đưa nó vào Manifest.

Tuy nhiên, tôi không thể để máy thu phát bị giết bởi GC khi tôi cần thông tin này vì vậy tôi đang đăng ký máy thu phát sóng trong một Service.

Do đó, tôi cần một Contextcuộc gọi registerReceiver(). Khi tôi không còn cần ACTION_PHONE_STATE_CHANGEDtôi sẽ hủy đăng ký nó.

Bất cứ lời khuyên?

Câu trả lời:


780

3
Tôi đã có vấn đề này, nhưng hóa ra đó là luồng công nhân không có ngữ cảnh. Tôi đã giải quyết nó thông qua một bối cảnh khi xây dựng chuỗi.
ctrl-alt-delor

17
Lưu ý: Ngữ cảnh trong dịch vụ sẽ không hiển thị cho đến khi onStart hoặc onStartCommand trong các dịch vụ: stackoverflow.com/questions/7619917/ trên
lớp

36
Đây có thể là câu trả lời ngắn nhất với số phiếu cao nhất trong stackoverflow
Sayka

4
xem xét kích thước của câu trả lời và số lượt nhận được, tôi không nghĩ câu trả lời nào khác trong SO đánh bại điều này :)
Amruta-Pani

2
4 từ này chỉ giải quyết vấn đề của tôi mà tôi đã cố gắng giải quyết trong 3 giờ.
Nirup Iyer

64

Servicekéo dài ContextWrappermà kéo dài Context. Do đó Servicelà một Context. Sử dụng 'this'từ khóa trong dịch vụ.


31
  1. Service kéo dài ContextWrapper
  2. ContextWrapper kéo dài Context

Vì thế....

Context context = this;

(trong lớp Dịch vụ hoặc Hoạt động)


8

Servicelà một Context, bối cảnh biến phải là this:

DataBaseManager dbm = Utils.getDataManager(this);   

5

Dịch vụ đã là một Ngữ cảnh riêng của mình

bạn thậm chí có thể vượt qua:

Context mContext = this;

HOẶC LÀ

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

1

chỉ trong trường hợp ai đó nhận được NullPointerException, bạn cần có được bối cảnh bên trongonCreate().

Servicelà một Context, vì vậy hãy làm điều này:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.