2012-02-01 467 views
74

我試圖在Service內啓動BroadcastReceiver。我想要做的是有一個後臺運行service去收集傳入的短信,並記錄來電。我想最好的辦法是運行一個service,它包含一個可以編目的廣播接收器。服務內的廣播接收器

我該如何去做這件事?我已經啓動並運行了我的服務。

回答

106

爲您服務已經安裝,只需在您的服務中添加廣播接收器:在

private final BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if(action.equals("android.provider.Telephony.SMS_RECEIVED")){ 
     //action for sms received 
     } 
     else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ 
      //action for phone state changed 
     }  
    } 
}; 

服務的onCreate做到這一點:

IntentFilter filter = new IntentFilter(); 
filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED); 
filter.addAction("your_action_strings"); //further more 
filter.addAction("your_action_strings"); //further more 

registerReceiver(receiver, filter); 

,並在服務的onDestroy

unregisterReceiver(receiver); 

和你很好去接收廣播的東西ver在onStartCommand中提到過濾器。確保在需要時添加任何權限。例如,

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
+0

我想顯示吐司消息而來電呼叫。我加了這個filter.addAction(「android.provider.Telephony.LISTEN_CALL_STATE」);那麼如何做吐司。 – Prasad 2014-08-05 16:23:06

+0

我發現在發送sendBroadcas(意圖)和braoadcastReceiver在這種情況下不起作用時,我無法通過intent.setData(myUri)傳遞數據,是嗎? – deadfish 2014-11-15 19:18:03

+0

我有點迷惑服務生命週期時,它有BroadcastReceiver(在我的情況下載BroadcastReceiver) – 2015-02-05 05:13:18

23

更好的模式是創建一個獨立的BroadcastReceiver。這可以確保您的應用可以響應廣播,無論是否運行Service。實際上,使用這種模式可以完全消除對恆定運行Service的需要。

在您的Manifest中註冊BroadcastReceiver,併爲其創建一個單獨的類/文件。

如:

<receiver android:name=".FooReceiver" > 
    <intent-filter > 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

當接收器運行時,您只需通過一個IntentBundle)到Service,並在onStartCommand()迴應。

例如:

public class FooReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // do your work quickly! 
     // then call context.startService(); 
    } 
} 
+3

我希望廣播處於服務的生命週期內,以便應用程序僅根據服務時間線查詢郵件/電話。這個方法是否啓用了這個功它看起來像你已經設置好了,所以廣播的接收啓動了服務。 – Utopia025 2012-02-05 03:54:19

+0

如果它尚未運行,則此實現將啓動「服務」,或者如果它是(通過'onStartCommand'中的檢索)則傳遞一個新的「Intent」。如果你只希望它在'Service'處於活動狀態時運行,你可以通過'PackageManager'的'setComponentEnabledSetting()'以編程方式啓用/禁用'Receiver'組件。 – 2012-02-05 04:24:17

+3

Waqas的答案可能是你最好的選擇,如果你只希望在'Service'正在運行時'Receiver'活着。 – 2012-02-05 04:27:50