2016-09-15 134 views
2

我有一个BroadcastReceiver类读取传入sms并从sms提取一个引脚。 我想将该sms传递给用户已经看到的活动。 用户应该在EditText中输入引脚,我将EditText中的值输入,将用户输入的引脚与BroadcastReceiver传递的引脚进行比较。如果两者都匹配,用户可以进入应用程序。但我不知道如何将BroadcastReceiver收到的PIN码传递到Activity。 下面是代码如何将数据从BroadcastReceiver传递给Activity?

广播接收器类

public class IncomingMessage extends BroadcastReceiver { 

final SmsManager sms = SmsManager.getDefault(); 
private OnSMSReceived onSMSReceived = null; 

@Override 
public void onReceive(Context context, Intent intent) { 

    // Retrieves a map of extended data from the intent. 
    final Bundle bundle = intent.getExtras(); 

    try { 

     if (bundle != null) { 

      String senderNum = null; 
      String message = null; 
      final Object[] pdusObj = (Object[]) bundle.get("pdus"); 

      for (int i = 0; i < pdusObj.length; i++) { 

       SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
       String phoneNumber = currentMessage.getDisplayOriginatingAddress(); 

       senderNum = phoneNumber; 
       message = currentMessage.getDisplayMessageBody(); 

       Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message); 

      } 

      if (senderNum.equals("ideamart")) { 
       Log.d("MessageIdeaMart", message); 

      } else if (senderNum.equals("FindDroid")) { 
       if (message.startsWith("Welcome")) { 
        String[] splitArray = message.split(" "); 
        String pin = splitArray[7]; 
        Log.d("PIN", pin); 

       } 
      } 
     } 
    } catch (Exception e) { 
     Log.e("SmsReceiver", "Exception smsReceiver" + e); 

    } 
} 


public void setOnSmsReceivedListener(Context context) { 
    this.onSMSReceived = (OnSMSReceived) context; 
} 


public interface OnSMSReceived { 
    void onSMSReceived(String pin); 
} 

}

+0

嘿,您只需建立必要的活动内的广播接收器类。分别在onResume和onPause中注册和注销它。现在,当您在此时发送广播时,请使用与创建内部活动时广播的内容相同的操作。 –

回答

0

您可以在活动中创建动态广播接收器:

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Received Broadcast", Toast.LENGTH_SHORT).show(); 
    } 
}; 

@Override 
protected void onResume() { 
    super.onResume(); 
    // Register the receiver 
    String action = "com.SOME_BROADCAST"; 
    registerReceiver(mReceiver, new IntentFilter(action)); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    // Unregister the receiver to save unnecessary system overhead 
    // Paused activities cannot receive broadcasts anyway 
    unregisterReceiver(mReceiver); 
} 
0

您已经定义的监听你的BroadcastReceiver类。那个听众的目的是什么?

的方式可以将数据实际上传递到活动

  • 。利用监听器,当你收到短信通知关于它的听众。
  • 将BroadcastReceiver作为Activity的内部类。
  • 我想,你也可以使用Intents将数据传递给Activity。
0

您必须制作一个广播接收器并将其注册到活动中。 从onReceive方法中,您可以执行UI更改。 或者您可以从意图获取数据或捆绑(如果有的话)。

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    TextView tv=(TextView)findViewById(R.id.tv); 
    tv.setText("Hello"); 
    } 
}; 

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(receiver, new IntentFilter("my.custom.action")); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(receiver); 
} 
1

使变量onSMSReceived静中IncomingMessage

让您setOnSmsReceivedListener方法静态和改变它的签名是:

public static void setOnSmsReceivedListener(OnSMSReceived onSMSReceived) { 
onSMSReceived = onSMSReceived; 
} 

您的接口:(改变方法的名称,以避免混淆)

public interface OnSMSReceived { 
void smsReceived(String pin); 
} 

然后当y我们senderNum匹配,那么这样做,(你让图钉后)

onSMSReceived.smsReceived(pin); 

,并在您的活动做到这一点:

IncomingMessage.setOnSmsReceivedListener(new OnSMSReceived(){ 
     @Override 
     public void messageReceived(String pin) { 
      // get the pin from EditText which is entered by user 
      // match it with the one you are getting here 
     } 
}) 
+0

将接收器注册到清单中,如果它被写入单独的类 –

相关问题