Android + Firebase перезапуск активности там, где не нужно

Я столкнулся с проблемой, из-за которой не могу дальше продолжать изучать Android. Помогите пожалуйста разобраться, каждый раз когда в приложении я нажимаю одну из трех кнопок и отправляю данные о нажатии в Firebase, насколько я понимаю, происходит полная перезагрузка активности. Ее тут не задумывалось, я похоже что-то не так наделал со структурой программы или методами ValueEventListener, при нажатии кнопки должна нажиматься только кнопка, но из-за связи с БД активность после нажатия запускается заново, судя по логам

Пример вывода(Проверял, что сверка имени пользователя с БД каждый раз проходит заново после нажатия кнопки, смущает OnActivityCreated)

I/System.out: Переделал имя!
V/FA: Screen exposed for less than 1000 ms. Event not sent. time: 585
V/FA: Activity paused, time: 19812524
V/FA: onActivityCreated
V/FA: Activity resumed, time: 19812574
I/System.out: Переделал имя!

Так как я не знаю, где именно ошибка, может и в целом в структуре, прикрепляю полный код активности с пояснениями в паре мест:

public class WorkerCabinetActivity extends AppCompatActivity {
    Button btnSignOut;
    FirebaseUser dbuser = FirebaseAuth.getInstance().getCurrentUser();
    DatabaseReference db2 = FirebaseDatabase.getInstance().getReference();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_worker_cabinet);
        btnSignOut = findViewById(R.id.sign_out_button);
        RadioButton btnOnlineFree = findViewById(R.id.online_free_button);
        RadioButton btnOnlineBusy = findViewById(R.id.online_busy_button);
        RadioButton btnOffline = findViewById(R.id.offline_button);

        initialize_view();

        btnSignOut.setOnClickListener(v -> {
            startActivity(new Intent(WorkerCabinetActivity.this, MainActivity.class));
            finish();
        });

        btnOnlineBusy.setOnClickListener(v -> writeUserStatus(dbuser.getUid(), "online busy"));
        btnOnlineFree.setOnClickListener(v -> writeUserStatus(dbuser.getUid(), "online free"));
        btnOffline.setOnClickListener(v -> writeUserStatus(dbuser.getUid(), "offline"));
    }

    private void initialize_view() {
        btnSignOut = findViewById(R.id.sign_out_button);
        RadioButton btnOnlineFree = findViewById(R.id.online_free_button);
        RadioButton btnOnlineBusy = findViewById(R.id.online_busy_button);
        RadioButton btnOffline = findViewById(R.id.offline_button);
        TextView helloText = findViewById(R.id.worker_cabinet_hello);
        TextView clarification = findViewById(R.id.extra_cabinet_information);

        check_buttons(btnOnlineFree, btnOnlineBusy, btnOffline); //Метод сверяет статус в БД и нажимает соответствующую кнопку для сохранения при перезапуске

        set_name(helloText, clarification); //Метод устанавливает приветственный текст
    }

    private void check_buttons(RadioButton btnOnlineFree, RadioButton btnOnlineBusy, RadioButton btnOffline) {
        ValueEventListener postListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getStatus().equals("offline") && !btnOffline.isChecked()){
                    btnOffline.setChecked(true);
                } else if(Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getStatus().equals("online free")  && !btnOnlineFree.isChecked()){
                    btnOnlineFree.setChecked(true);
                } else if(Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getStatus().equals("online busy")  && !btnOnlineBusy.isChecked()){
                    btnOnlineBusy.setChecked(true);
                } else{
                    db2.child("Users").child(dbuser.getUid()).child("status").setValue("offline");
                    btnOffline.setChecked(true);
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {}
        };
        db2.addListenerForSingleValueEvent(postListener);
    }

    private void set_name(TextView helloText, TextView clarification) {
            ValueEventListener name_listener = new ValueEventListener() {
                @SuppressLint("SetTextI18n")
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    String name = Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getName();
                    String[] nameToken = name.split(" ");
                    helloText.setText("Добрый день, " + nameToken[1] + '!');
                    clarification.setText("Выберите статус для отображения: ");
                    System.out.println("Переделал имя!");
                }
                @Override
                public void onCancelled(@NonNull DatabaseError error) {}
            };
            db2.addListenerForSingleValueEvent(name_listener);
    }

    private void writeUserStatus(String userId, String status) {
        db2.child("Users").child(userId).child("status").setValue(status);
    }
}

Подскажите пожалуйста, добрые люди, в чем проблема? В Гугле вроде не забанен, но там ответа на вопрос в понятной мне формулировке не имеется.


Ответы (1 шт):

Автор решения: Arty Morris

Здесь вы запускаете MainActivity из своей Activity. И сразу завершает свою активность. Зачем? Естественно у вас получается перезапуск не приложения, а главного Activity. Попробуйте убрать эти строчки

 btnSignOut.setOnClickListener(v -> {
        startActivity(new Intent(WorkerCabinetActivity.this, MainActivity.class));
        finish();
 });
→ Ссылка