Witam, mam problem z aplikacją, którą tworzę w Android Studio. Generalnie jej przeznaczeniem jest komunikacja z aplikacją webową za pomocą Firebase - to taki trochę uboższy MightyText.
Na stronie podaje numer i tekst wiadomości, leci to do FB, telefon widzi zmianę w bazie i rozpoczyna wysyłkę SmsManagerem. Tutaj pojawia się problem, bo czasami telefon wysyła kilka wiadomości (3-4), pomimo tego, że pokazuje mi wykonanie tylko jednej iteracji i zakończenie wysyłki. Pomimo mojej mojej zerowej wiedzy na temat programowania w Javie / tworzenia aplikacji na system Android postanowiłem podjąć się zadania..

Postaram się mniej więcej zobrazować to co próbowałem zdziałać w tym kodzie:
Aplikacja odpala wakelocka (po pewnym czasie telefon przestał wysyłać/odbierać smsy, stad użycie wakelocka)
Jeżeli apka zauważy zmianę w FireBase (czyli rozpocząłem wysyłkę sms) to pobiera z bazy numery i dodaje je do tablicy
Pętla po wszystkich numerach jeżeli jest ich więcej niż 1 (masowe smsy na święta :)) SmsManager wysyła smsy do każdego numeru
Koniec wysyłki, czyszczenie FireBase i apka oczekuje na kolejne instrukcje..

Wszystko fajnie by działo, gdyby nie ten problem, ktory pojawia się sporadycznie, że wysyła mi kilka takich samych sms'ów..
Zdaję sobie sprawę, że to kod spaghetti i proszę o wyrozumiałość, to moja pierwsza apka na telefon. Proszę bardzo o jakieś nakierowanie na rozwiązanie problemu. To jest wczesna wersja aplikacji, z biegem czasu wdrożę się bardziej w język.

public class MainActivity extends Activity {

    // Event Log
    ListView lv;
    ArrayList<String> event_log_array = new ArrayList<String>();
    ArrayAdapter adapter;

    // Numbers Array
    ArrayList<String> numbers_array = new ArrayList<String>();
    // Count how many numbers are added to database;
    int array_counter = 0;

    // Sms text delay
    int delay = 5000;

    // Broadcast
    BroadcastReceiver receiver=null;

//    Sms text msg
    String textMsg = "";

//    Time now
    SimpleDateFormat dateFormat = new SimpleDateFormat("[dd/MM/yy] HH:mm");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context arr0, Intent arr1) {
               processReceive(arr0, arr1);
            }
        };
        registerReceiver(receiver, filter);


        // Event Log
        lv = (ListView) findViewById(R.id.listView);
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, event_log_array);
        lv.setAdapter(adapter);

        // Setting Up a wakeLock
        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TextGate_wakeLock");
        if ((wakeLock != null) && (!wakeLock.isHeld())) {
            event_log("Wake Lock is on");
            wakeLock.acquire();
        }

        DatabaseReference SendStatusReference = FirebaseDatabase.getInstance().getReference("isSending");
        SendStatusReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.getValue() != null && dataSnapshot.getValue().toString().equals("true")) {
                    send_sms();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }


    public void processReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Object[] objArr = (Object[])bundle.get("pdus");
        String sms = "";
        String client_number = "";
        String client_text_msg = "";
        Map<String,Object> values = new HashMap<>();

        for (int i = 0; i < objArr.length; i++) {
            SmsMessage smsMsg = SmsMessage.createFromPdu((byte[]) objArr[i]);
            client_text_msg = smsMsg.getMessageBody();
            client_number = smsMsg.getDisplayOriginatingAddress();
            sms += client_text_msg;
        }
        DatabaseReference received_reference = FirebaseDatabase.getInstance().getReference().child("received");
        values.put("client_number", client_number);
        values.put("client_text_msg", sms);
        values.put("client_text_msg_date", get_current_time());
        received_reference.push().setValue(values);
        event_log("Wykryto wiadomość przychodzącą o treści: " + sms);

    }


    public void send_sms() {
        event_log("Inicjowanie funkcji rozsyłania wiadomości SMS");
        check_numbers();

        DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
        DatabaseReference textMsgReference = FirebaseDatabase.getInstance().getReference().child("textMsg");

        textMsgReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.getValue() != null) {
                    textMsg =  dataSnapshot.getValue().toString();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                if (!numbers_array.isEmpty()) {
                    event_log("Ilość numerów dodanych do tablicy: " + numbers_array.size());
                    event_log("Treść wiadomości, która zostanie rozesłana: " + textMsg);

                    final Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            SmsManager smsManager = SmsManager.getDefault();
                            event_log("Wiadomość została wysłana pod numer: " + numbers_array.get(array_counter));
                            smsManager.sendTextMessage(numbers_array.get(array_counter), null, textMsg , null, null);
                            if (array_counter < numbers_array.size() - 1) {
                                handler.postDelayed(this, delay);
                                array_counter++;

                            } else {
                                DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
                                mDatabase.child("clientsNumbers").removeValue();
                                mDatabase.child("isSending").removeValue();
                                mDatabase.child("textMsg").removeValue();
                                numbers_array.removeAll(numbers_array);
                                array_counter = 0;
                                event_log("Funkcja rozsyłania wiadomości SMS zakończona powodzeniem.");
                            }
                        }
                    }, delay);
                } else {
                    event_log("Baza numerów telefonów jest pusta.");
                    event_log("Funkcja rozsyłania wiadomości SMS zatrzymana.");
                }
            }
        }, 10000);

    }

    public void check_numbers() {
        DatabaseReference ClientsNumbersReference = FirebaseDatabase.getInstance().getReference().child("clientsNumbers");
        ClientsNumbersReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.toString() != null) {
                    Iterable<DataSnapshot> children = dataSnapshot.getChildren();

                    for (DataSnapshot child : children) {
                        String test = child.getValue().toString();
                        String[] parts = test.split("=");
                        String part1 = parts[0];
                        String part2 = parts[1];
                        part2 = part2.substring(0, part2.length() - 1);

                        if (!numbers_array.contains(part2)) {
                            numbers_array.add(part2);
                        }

                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    public void event_log(String log_msg) {
        event_log_array.add(get_current_time() + " | " + log_msg);
        adapter.notifyDataSetChanged();
        lv.setSelection(adapter.getCount() - 1);
    }
    
    public String get_current_time() {
        String TimeNow = dateFormat.format(new Date());
        return TimeNow;
    }

}