3

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

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

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

  1. 启动应用
  2. 按发送短信
  3. 接收器以参数启动并发送短信
  4. 接收者收到一条短信并停止。

接收者:

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

活动:
接收者:

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

4

2 回答 2

1
  1. BroadcastReceiver你不能在任何你想要的时候开始和停止。只有在执行BroadcastReceiver时才活着。onReceive()
  2. 要发送广播,您应该使用sendBroadcast(this.service)而不是startService(this.service);
  3. 将其更改为后,sendBroadcast(this.service)您将收到两个广播(第一个来自您sendBroadcast(),第二个来自SmsManager)。这绝对不是您想要的,因为在第一种情况下,您将能够获得您的checked参数,但SmsMessage在第二种情况下反之亦然。
  4. 您可以将此checked参数存储在中SharedPreferences,然后检索它onReceive()
于 2013-01-08T09:25:39.577 回答
1

使用自定义意图广播来实现当前流量。将您的代码更改为:

第1步 :

SMS_RECEIVED在 Manifest 中注册一个自定义 Intent为:

<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);
     }
于 2013-01-08T09:36:36.180 回答