2010-11-10 27 views
43

Tôi đang xây dựng một ứng dụng kích hoạt báo thức qua AlarmManager.Làm thế nào để sử dụng getSystemService trong một lớp không hoạt động?

Tôi muốn có thể gọi báo thức qua lớp không hoạt động của riêng mình, nhưng vì tôi không mở rộng Hoạt động, tôi dường như không có bất kỳ 'ngữ cảnh' nào. Khái niệm này làm tôi bối rối, và tôi đã đọc tài liệu sdk.

Làm thế nào tôi sẽ đi về việc sử dụng:

alarmTest = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

trong lớp không activty của tôi?

Ngoài ra, tôi giả sử nhận bối cảnh cũng sẽ cho phép tôi sử dụng SharedPrefs và Intents trong lớp không hoạt động của mình?

Trả lời

36

Bạn có thể vượt qua hoàn cảnh để lớp không hoạt động mà là cách ưa thích hoặc bạn có thể tóm lược bối cảnh cơ sở của việc áp dụng một singleton mà sẽ cho phép bạn truy cập vào bối cảnh bất cứ nơi nào trong ứng dụng. Ở một số trường hợp, đây có thể là một giải pháp tốt nhưng ở những trường hợp khác thì chắc chắn nó không phải là một giải pháp tốt.

Dù sao, nếu bạn muốn kích hoạt báo động thông qua AlarmManager Tôi khá chắc chắn rằng báo động nên kế thừa từ một Service hoặc tốt hơn là từ IntentService và trong những trường hợp như vậy, bạn có thể truy cập đến bối cảnh qua this.getBaseContext() hoặc this.getApplicationContext()

+1

Bạn có nên vượt qua ngữ cảnh không? Điều đó không dẫn đến bối cảnh bị rò rỉ? – Amit0191

4

Bạn cần chuyển ngữ cảnh vào lớp không hoạt động.

16

ServiceActivity được kế thừa từ Context - vì vậy khi bạn gọi getSystemService trong các lớp này, bạn thực sự đang gọi super.getSystemService.

Nếu bạn muốn có một Context sẵn trong lớp khác, bạn có thể vượt qua một như một cuộc tranh cãi đến một phương pháp của lớp đó, giữ một tham chiếu đến nó, vv

Sửa: mẫu mã. Nhưng nghiêm túc, nó là cực kỳ cơ bản - nếu bạn hiểu thừa kế và phương pháp.

class MyActivity extends Activity { // Activity extends Context, so MyActivity also extends Context 
    void someMethod() { 
    MyOtherClass.useStaticContext(this); 
    MyOtherClass instance = new MyOtherClass(); 
    instance.useInstanceContext(this.getApplicationContext()); 
    } 
} 
class MyOtherClass { 
    static void useStaticContext(Context context) { 
    } 
    void useInstanceContext(Context context) { 
    } 
} 
+2

Tôi nghĩ rằng tôi hiểu ý của bạn là gì. Bạn có biết rằng tôi có thể tìm mã mẫu ở đâu trong repo không? Cảm ơn! – eportermd

12

Bạn có thể thử như sau, nó cho phép bạn có được bối cảnh hiện tại mà khung nhìn đang chạy qua.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE); 
Các vấn đề liên quan