2016-09-15 125 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

將接收器註冊到清單中,如果它被寫入單獨的類 –

相關問題