我試圖在Service
內啓動BroadcastReceiver
。我想要做的是有一個後臺運行service
去收集傳入的短信,並記錄來電。我想最好的辦法是運行一個service
,它包含一個可以編目的廣播接收器。服務內的廣播接收器
我該如何去做這件事?我已經啓動並運行了我的服務。
我試圖在Service
內啓動BroadcastReceiver
。我想要做的是有一個後臺運行service
去收集傳入的短信,並記錄來電。我想最好的辦法是運行一個service
,它包含一個可以編目的廣播接收器。服務內的廣播接收器
我該如何去做這件事?我已經啓動並運行了我的服務。
爲您服務已經安裝,只需在您的服務中添加廣播接收器:在
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" />
更好的模式是創建一個獨立的BroadcastReceiver
。這可以確保您的應用可以響應廣播,無論是否運行Service
。實際上,使用這種模式可以完全消除對恆定運行Service
的需要。
在您的Manifest中註冊BroadcastReceiver
,併爲其創建一個單獨的類/文件。
如:
<receiver android:name=".FooReceiver" >
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
當接收器運行時,您只需通過一個Intent
(Bundle
)到Service
,並在onStartCommand()
迴應。
例如:
public class FooReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// do your work quickly!
// then call context.startService();
}
}
我希望廣播處於服務的生命週期內,以便應用程序僅根據服務時間線查詢郵件/電話。這個方法是否啓用了這個功它看起來像你已經設置好了,所以廣播的接收啓動了服務。 – Utopia025 2012-02-05 03:54:19
如果它尚未運行,則此實現將啓動「服務」,或者如果它是(通過'onStartCommand'中的檢索)則傳遞一個新的「Intent」。如果你只希望它在'Service'處於活動狀態時運行,你可以通過'PackageManager'的'setComponentEnabledSetting()'以編程方式啓用/禁用'Receiver'組件。 – 2012-02-05 04:24:17
Waqas的答案可能是你最好的選擇,如果你只希望在'Service'正在運行時'Receiver'活着。 – 2012-02-05 04:27:50
我想顯示吐司消息而來電呼叫。我加了這個filter.addAction(「android.provider.Telephony.LISTEN_CALL_STATE」);那麼如何做吐司。 – Prasad 2014-08-05 16:23:06
我發現在發送sendBroadcas(意圖)和braoadcastReceiver在這種情況下不起作用時,我無法通過intent.setData(myUri)傳遞數據,是嗎? – deadfish 2014-11-15 19:18:03
我有點迷惑服務生命週期時,它有BroadcastReceiver(在我的情況下載BroadcastReceiver) – 2015-02-05 05:13:18