Когда несколько щелчков мышью на переходе по активности нажимают, почему методы второго жизненного цикла вызываются дважды - PullRequest
0 голосов
/ 01 июля 2019

Когда я несколько раз нажимаю на кнопку прохождения активности, activity1 переходит в состояние паузы и через несколько секунд activity2 переходит на передний план / отображается для состояния пользователя.

Моя проблема в том, что когда мы переходим к действиям с несколькими нажатиями, пользователю требуется несколько секунд, чтобы дождаться, когда следующая активность перейдет в видимое состояние. это действительно плохая практика.

Вот журналы вызовов методов жизненного цикла acticity:

calling pause - Activity1

call: calling noti create  - Activity2
call: calling noti start - Activity2
call: calling noti resume- Activity2
call: calling noti pause- Activity2
//2nd time calls of lifecycle methods
calling noti create- Activity2
call: calling noti start- Activity2
call: calling noti resume- Activity2

Вот нажатие кнопки навигации по активности:

@OnClick({R.id.card_notification})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.card_notification:
                 startActivity(new Intent(context, NotificationsActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

              break;
        }
    }

если я удаляю setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), activity2 открывается несколько раз, когда несколько нажатий на кнопку нажимают.

Я пытался установить режим запуска в файле манифеста.

<activity android:launchMode=”singleTop” />

в этом случае также activity 2 требуется несколько миллионных секунд, чтобы прийти в видимое состояние.

Примечание: при однократном нажатии / нажатии все работает нормально.

Пожалуйста, помогите мне, что не так в этом сценарии.

Здесь 2-й код активности:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_noti_detail);
        Log.e("call", "noti create");

        context = this;
        ButterKnife.bind(this);
        setToolbar();
        callApi("");
        etSearchh.setOnEditorActionListener((v, actionId, event) ->
        {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                isSearch = true;
                //membersList = null;
                callApi(etSearchh.getText().toString().trim());
                CommonUtils.hideKeyboard(this);
                return true;
            }
            return false;
        });

        etSearchh.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (s.toString().length() > 0) {
                    iv_clearSearch.setVisibility(View.VISIBLE);
                } else {
                    iv_clearSearch.setVisibility(View.INVISIBLE);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
        iv_clearSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                iv_clearSearch.setVisibility(View.GONE);
                etSearchh.setText("");
                //membersList = null;
                callApi("");
            }
        });

    }

    private void callApi(String searchBy) {
        new NotificationController(apiCallBack, context, searchBy).callTokenAPI();
    }

    private void setToolbar() {
        toolbarTitle.setText(MyApplication.getLabelModel().getLabels().getTT_NOTIFICATIONS());
        etSearchh.setHint(MyApplication.getLabelModel().getLabels().getSEARCH_NOTIFICATION());
    }

    private void setRecycler(List<Notifications> notifications) {
        mAdapter = new NotificationAdapter(notifications, context);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);
    }

    @OnClick(R.id.iv_back)
    public void onViewClicked() {
        onBackPressed();
    }

    @Override
    protected void onStart() {
        Log.e("Call", "calling noti start");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e("Call", "calling noti resume");
        super.onResume();
    }

    @Override
    protected void onStop() {
        Log.e("Call", "calling noti stop");
        super.onStop();
    }

    @Override
    protected void onPause() {
        Log.e("Call", "calling noti pause");
        super.onPause();
    }

1 Ответ

0 голосов
/ 09 июля 2019

Чтобы предотвратить многократное выполнение нажатий кнопок, вам нужно добавить переменную boolean, которую вы используете, чтобы помнить, что кнопка была нажата, и игнорировать нажатие кнопки как «шум», если вы видите ее снова. Используя ваш пример, сделайте это:

Добавьте boolean переменную-член в ваш класс:

private boolean buttonClicked;

В методе onViewClicked() установите переменную buttonClicked и игнорируйте щелчок, если он уже был установлен:

public void onViewClicked(View view) {
    switch (view.getId()) {
        case R.id.card_notification:
             // Ignore if already clicked
             if (buttonClicked) {
                 return;
             }
             startActivity(new Intent(context, NotificationsActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
             // Remember that the button was clicked
             buttonClicked = true;
             break;
     }

Это предотвратит запуск нескольких копий NotificationsActivity несколькими щелчками. Когда пользователь вернется к этому Activity, вы захотите сбросить buttonClicked в onResume(), чтобы пользователь мог снова нажать кнопку (в противном случае пользователь сможет нажать кнопку только один раз!).

...