2010-11-10 52 views
43

我正在構建一個通過AlarmManager觸發報警的應用程序。如何在非活動類中使用getSystemService?

我希望能夠通過它自己的非活動類來調用鬧鐘,但由於我沒有擴展活動,我似乎沒有任何「上下文」。這個概念讓我感到困惑,而且我讀過了sdk文檔。

我怎麼會去使用:

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

在我的非activty類?

此外,我假設獲取上下文將允許我在我的非活動類中使用SharedPrefs和Intents?

回答

36

您可以通過上下文的非活性類,這是首選的方式,或者你可以封裝應用程序的基本背景下,以一個單身這將讓你的應用程序中的任何位置訪問上下文。在某些情況下,這可能是一個很好的解決方案,但在其他情況下,它肯定不是一個好方案

無論如何,如果要觸發通過AlarmManager報警我敢肯定,報警應該從ServiceIntentService繼承或更好,但在這種情況下,您通過this.getBaseContext()this.getApplicationContext()

+1

建議通過上下文嗎?這不會導致上下文泄漏? – Amit0191 2016-06-17 18:15:07

4

您需要將上下文傳遞到非活動類。

16

ServiceActivity繼承自Context - 因此當您在這些類中調用getSystemService時,您確實呼叫super.getSystemService

如果你想在其他類Context可用,您可以通過一個作爲參數傳遞給這個類的方法,保持對它的引用等

編輯:代碼示例。但嚴重的是,它基本上是極其 - 如果你瞭解繼承和方法。

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

我想我明白你的意思。你會碰巧知道我可以在回購站點找到這個示例代碼嗎?謝謝! – eportermd 2010-11-10 05:53:27

12
訪問上下文

您可以嘗試以下操作,它允許您獲取視圖正在運行的當前上下文。

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE); 
相關問題