2010-12-16 119 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虽然....