当多次单击活动导航时,为什么第二个活动生命周期方法调用两次

时间:2019-07-01 10:21:03

标签: java android android-lifecycle

当我多次点击活动通过按钮时,activity1处于暂停状态,几秒钟后activity2进入前台/用户状态可见。

我的问题是,当我们进行多次轻击时,用户需要等待几秒钟的时间才能等待下一个活动进入可见状态。这确实是一个坏习惯。

这是规则生命周期方法的调用日志:

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 :(得分:0)

为防止多次执行按钮按下操作,您需要添加一个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(),以便用户可以再次单击该按钮(否则,该用户只能单击一次按钮!)。