手动启动/停止接收器并将参数传递给接收器

时间:2013-01-08 08:52:53

标签: android broadcastreceiver android-service

我的项目很简单。它有一个activity和一个broadcast receiver。在我的应用程序中,我希望能够发送短信接收短信。这很有效。

但是现在我想将一些数据从视图传递到接收器。想象一个简单的checkbox,我想将其值传递给receiver

所以这是我的应用程序的基本生命周期:

  1. 启动应用
  2. 按发送短信
  3. 接收器以params启动,短信发送
  4. 收件人收到短信并停止。
  5. 接收器:

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

    Activity:  
    Receiver:

    我试图传递一个值,但它似乎被忽略了。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

  1. 您不能随时启动和停止BroadcastReceiverBroadcastReceiver仅在onReceive()执行时才有效。
  2. 要发送广播,您应使用sendBroadcast(this.service)代替startService(this.service);
  3. 将其更改为sendBroadcast(this.service)后,您将收到两个广播(首先来自sendBroadcast(),第二个来自SmsManager)。这绝对不是您想要的,因为在第一种情况下,您将能够获得checked参数而不是SmsMessage,反之亦然。
  4. 您可以在checked中存储此SharedPreferences个参数,然后在onReceive()
  5. 上检索它

答案 1 :(得分:1)

使用自定义意图广播来实现当前流量。在代码中进行更改:

第1步:

在Manifest中将SMS_RECEIVED注册为自定义意图:

<receiver android:name=".SmsReceiver"> 
    <intent-filter android:priority="1000"> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
       <action android:name="xx.xxx.xxx.intent.action.SMS_STATUS_ACTION" />
    </intent-filter> 
</receiver>

第2步:

public class SmsReceiver extends BroadcastReceiver {
  public static final String STATUS_INTENT = 
                  "xx.xxx.xxx.intent.action.SMS_STATUS_ACTION";
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
            if (arg1.getAction().equals(SmsReceiver.STATUS_INTENT)) {

                    // get value here sended from Activity 
             }
            else{
                    // Check for SMS_RECEIVED Action here
              }
    }

}

第3步:

使用sendBroadcast

从您的活动中发送值
public static final String STATUS_INTENT = 
                         "xx.xxx.xxx.intent.action.SMS_STATUS_ACTION";
@Override
    public void onClick(View v) {

        int checked = 0;

        if(this.param.isChecked()){
            checked = 1;
        }
        // put value here
        Intent intent = new Intent();
            intent.putInt("param", checked);
            intent.setAction(CUSTOM_INTENT);
            sendBroadcast(intent);
     }