Android 如何将数据从广播接收器传递到活动?
我有一个Android 如何将数据从广播接收器传递到活动?,android,android-activity,broadcastreceiver,Android,Android Activity,Broadcastreceiver,我有一个BroadcastReceiver类,它读取传入的sms,并从sms中提取pin码。 我想将该sms传递给用户已经可见的活动。 用户应在EditText中输入pin,我从中的EditText中获取值,将用户输入的pin与广播接收器传递的pin进行比较。如果两者都匹配,用户可以进入应用程序。但我不知道如何将广播接收器接收到的Pin码传递到活动。 这是密码 广播接收机类 public class IncomingMessage extends BroadcastReceiver { fin
BroadcastReceiver
类,它读取传入的sms
,并从sms
中提取pin码。
我想将该sms
传递给用户已经可见的活动。
用户应在EditText
中输入pin,我从中的EditText
中获取值,将用户输入的pin与广播接收器传递的pin进行比较。如果两者都匹配,用户可以进入应用程序。但我不知道如何将广播接收器
接收到的Pin码传递到活动
。
这是密码
广播接收机类
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);
}
公共类IncomingMessage扩展了BroadcastReceiver{
final smsmsmanager sms=smsmsmanager.getDefault();
私有onsmserved onsmserved=null;
@凌驾
公共void onReceive(上下文、意图){
//从意图检索扩展数据的映射。
final Bundle=intent.getExtras();
试一试{
if(bundle!=null){
字符串senderNum=null;
字符串消息=null;
最终对象[]pdusObj=(对象[])bundle.get(“pdus”);
对于(int i=0;i
}您可以在活动中创建动态广播接收器:
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);
}
您已经在BroadcastReceiver类中定义了一个侦听器。那个听众的目的是什么
实际将数据传递给活动的方式
- 利用监听器,当你收到短信时通知监听器
- 将BroadcastReceiver作为活动的内部类
- 我认为,您还可以使用意图将数据传递给活动李>
您必须制作一个广播接收器并在活动中注册它。
通过其onReceive方法,您可以执行UI更改。
或者,如果存在数据或捆绑包,您也可以从intent获取数据或捆绑包
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);
}
在IncomingMessage
将您的设置msreceivedListener
方法设置为静态,并将其签名更改为:
public static void setOnSmsReceivedListener(OnSMSReceived onSMSReceived) {
onSMSReceived = onSMSReceived;
}
您的接口:(更改方法名称以避免混淆)
然后,当您的senderNum
匹配时,执行此操作(在您获得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
}
})
嘿,只需在所需的活动中创建一个广播接收器类。分别在onResume和onPause中注册和注销它。现在,当您在那个时候发送广播时,请使用和您在创建内部活动时对广播所做的相同的操作。若它是作为单独的类编写的,请在清单中注册接收方
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
}
})