2010-12-16 276 views
24

我有一個service可以從button啓動和停止。服務註冊接收器

但在service我想註冊一個收音機聽SMS廣播。我只想讓service在運行時收聽SMS。我試過registerReceiver(receiver, intentfilter)但這不起作用。我究竟做錯了什麼?

+0

如果你指定的問題,這個問題會更有幫助的人。 「這不起作用」=「接收器永遠不會被調用」,例如?或者它被調用,但不是與SMS_RECEIVED_ACTION?或者有錯誤?或... – LarsH 2017-01-19 20:06:15

回答

2

您必須在AndroidManifest文件中設置權限。

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

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

我已經做到了。我得到一個AccountManagerService和ContactsProvider錯誤/ – Vic 2010-12-16 15:10:57

+0

我的IntentFilter是否正確?私人靜態最終字符串SMS_RECEIVED_ACTION = 「android.provider.Telephony.SMS_RECEIVED」? – Vic 2010-12-16 15:12:04

+4

是的,您是如何在清單中添加接收器的,但我想動態註冊它。上述方法即使在我的服務停止時也會監聽所有傳入的SMS。我只想在我的服務正在運行時收聽短信。 – Vic 2010-12-16 15:14:47

77

如果你想只接收廣播,而您的服務正在運行,您將需要動態註冊接收器的onCreate()

此外,它不要忘記註銷您的接收器中的onDestroy是非常重要的() 方法!

實施例:

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.widget.Toast; 

public class YourClass extends Service { 

    private static final String ACTION="android.provider.Telephony.SMS_RECEIVED"; 
    private BroadcastReceiver yourReceiver; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     final IntentFilter theFilter = new IntentFilter(); 
     theFilter.addAction(ACTION); 
     this.yourReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // Do whatever you need it to do when it receives the broadcast 
       // Example show a Toast message... 
       showSuccessfulBroadcast(); 
      } 
     }; 
     // Registers the receiver so that your service will listen for 
     // broadcasts 
     this.registerReceiver(this.yourReceiver, theFilter); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     // Do not forget to unregister the receiver!!! 
     this.unregisterReceiver(this.yourReceiver); 
    } 

    private void showSuccessfulBroadcast() { 
     Toast.makeText(this, "Broadcast Successful!!!", Toast.LENGTH_LONG) 
       .show(); 
    } 
} 
+1

謝謝DDoSAttack,這很容易,我花了幾個小時尋找這個,但沒有找到任何好的解決方案,但你很容易理解。 (Y)謝謝:) – Zaksh 2013-05-03 20:40:56

+0

爲什麼這個答案不被接受爲解決方案? – akmal 2014-09-17 16:52:53

+0

這個答案是正確的。我用這個IntentService,它也工作,我想特別強調在onCreate()註冊接收器! – Edeph 2015-05-04 22:49:03

1

刪除從XML意向濾波器和僅做了接收機的動態登記。 如果您不希望它在服務關閉時運行,請在停止服務之前註銷它。不要忘了添加權限的XML雖然....