這是正確的行爲actully。每當您收到消息時,系統都會發送短信廣播。由於您的應用程序在聲明中聲明瞭它想要接收此類廣播,因此每次都會創建並執行BroadcastReceiver的新實例。
如果你想只在特定的時間執行接收器(在這種情況下,當你的應用程序是在前臺),你必須註冊,並通過使用Context.registerReceiver()
和Context.unregisterReceiver()
動態註銷它的代碼,而不是表現。
如何準確地做到這一點?
下面是一個簡短的例子。我假設你已經編寫了自己的類來擴展BroadcastReceiver並處理onReceive()
中的內容。在這個例子中,這個類的名字是SmsReceiver
,就像在鏈接教程中一樣。
我們的目標是隻在一個活動處於前臺時接收廣播,這意味着您還應該擁有一個擴展活動並像普通應用程序一樣顯示UI的類。
首先,我們需要一個接收器的實際實例作爲類成員。加入這樣的事情您的活動類:
private SmsReceiver smsReceiver = new SmsReceiver();
旁註:這實際上的主要區別之一在清單中,並在代碼登記之間:
- 在代碼中創建一個接收器實例自己
- 當在清單中註冊,系統會生成實例爲你在後臺
好,很好。現在,當活動進入前臺並退出時,我們只需註冊並取消註冊該接收器。看看Activity class doc中的圖表,這些事件中調用的框架方法是onResume()
和onPause()
。
添加以下行到你的onResume()
方法:
@Override
public void onResume() {
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsReceiver, filter);
}
我們在這裏所做的其實很簡單。它是清單<receiver />
標記的代碼等效物。我們用我們喜歡接收的廣播創建了一個intent過濾器,並使用它註冊我們的接收器。
下一步是取消註冊onPause()
。再次,如果您尚未添加此行或創建onPause()
。
@Override
public void onPause() {
unregisterReceiver(smsReceiver);
}
非常簡單 - 帶上我們的接收器實例,並在應用即將進入背景時取消註冊。這就是所有的魔法,一切都應該按照預期工作。 不要忘記刪除清單中的整個<receiver />
標記,但是當您使用現有代碼時。否則,您會以兩種方式註冊您的接收器。
所以我試圖實現你的建議,但我有點困惑。我在哪裏把registerReceiver,我如何正確使用它,即什麼是代碼示例。有沒有可以鏈接到我的例子?我有這個,但它會導致崩潰BroadcastReceiver BR = null; IntentFilter filter = null; registerReceiver(BR,filter); – 2011-12-21 03:12:56
@ChrisSippel你不能用這樣的'null'對象註冊。我爲我的答案添加了一個簡短的指南。 – 2011-12-21 10:58:05
所以我終於到處去做正確的事情,假期和學校,我一直很忙。所以我很高興地說它很有用,我非常感謝你! – 2012-01-14 21:12:45