After receiving a message through BroadcastReceiver I am auto-updating an edittext box with 6 numbers that are contained in the SMS. I can successfully do it for the first time but I wish to re-use the code for the second time but cannot find a way to do so.
public class SMSReceiver extends BroadcastReceiver {
private static EditText editTextInputNumber;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
"android.provider.Telephony.SMS_RECEIVED")) {
StringBuilder sms = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdusObj = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdusObj.length];
for (int i = 0; i < pdusObj.length; i++) {
messages[i] =
SmsMessage.createFromPdu((byte[]) pdusObj[i]);
}
for (SmsMessage smsMessage : messages) {
sms.append(smsMessage.getMessageBody());
}
sms.toString();
String smsBody = sms.toString();
Pattern pattern = Pattern.compile("\\d{6}");
Matcher matcher = pattern.matcher(smsBody);
String authNumber = null;
if (matcher.find()) {
authNumber = matcher.group(0);
}
if (authNumber != null) {
Activity_create.inputAuthNumber(authNumber);
I wish to use the above and change another edittext when some other activity is opened ex)Activity_findaccount.inputAuthNumber(authNumber);
}
}
}
}
INSIDE Activity_Create I am doing:
...
sendBroadcast(new Intent("android.provider.Telephony.SMS_RECEIVED"));
...
public static void inputAuthNumber(String authNumber) {
if (authNumber != null) {
et_dialog_access.setText(authNumber);
}
}
INSIDE Activity_findaccount I also want to do the same with a different edittext:
...
sendBroadcast(new Intent("android.provider.Telephony.SMS_RECEIVED"));
...
public static void inputAuthNumber(String authNumber) {
if (authNumber != null) {
et_find_access.setText(authNumber);
}
}
UPDATE:ANSWER: SEE COMMENTS BELOW FROM MIKEM. and the checked answer
Why unregistering is important = prevents leaking.
When to register/unregister follow this link: When to unregister BroadcastReceiver? In onPause(), onDestroy(), or onStop()?
My final coding Use this. instead of getActivity. if youre in class Activity
public class Fragment_findaccount1 extends Fragment{
BroadcastReceiver smsReceiver;
...
@Override
public void onPause(){
super.onPause();
getActivity().unregisterReceiver(smsReceiver);
}
...
private void SMS_Receive() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
smsReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
StringBuilder sms = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdusObj = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdusObj.length];
for (int i = 0; i < pdusObj.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
}
for (SmsMessage smsMessage : messages) {
sms.append(smsMessage.getMessageBody());
}
sms.toString();
String smsBody = sms.toString();
Pattern pattern = Pattern.compile("\\d{6}");
Matcher matcher = pattern.matcher(smsBody);
String authNumber = null;
if (matcher.find()) {
authNumber = matcher.group(0);
}
if (authNumber != null) {
inputAuthNumber(authNumber);
}
}
}
};
getActivity().registerReceiver(smsReceiver, intentFilter);
}
private void inputAuthNumber(String authNumber) {
if (authNumber != null) {
et_cert.setText(authNumber);
progressbar.setVisibility(View.INVISIBLE);
}
}