首页 > 解决方案 > onResume 被调用了很多次,即使它来到前台。为什么?

问题描述

我只想在我的应用程序进入后台时调用 onResume 。我有两个活动 A 和 B。从活动 B 切换到 A 时,我需要阻止 onPause() 和 onResume() 调用。如果我的应用不再出现在屏幕上或进入后台状态,则只应调用 onResume 和 onPause。下面是我的代码片段。请帮忙!

    BiometricManager mBiometricManager;
    UserSession userSession;
    boolean shouldExecuteOnFirstTime;
    boolean isPaused = true;
    private Dialog dialog;
    private ActivityNewMainBinding binding;
    SharedPreferences mPrefs;
    SharedPreferences.Editor prefsEditor;

    @Override
    protected void onPause() {
        super.onPause();
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        isPaused = pm.isScreenOn();

      }


    @Override
    protected void onPostResume() {
        super.onPostResume();
       /* */
        if(isPaused)
        {
        if (shouldExecuteOnFirstTime) {
            if (userSession.isLoggedInV2()) {
                Intent intent = new Intent(this, LocksWithoutKeystoreActivity.class);
                startActivity(intent);
                mBiometricManager = new BiometricManager.BiometricBuilder(getApplicationContext())
                    .setTitle(getString(R.string.biometric_title))
                    .setDescription(getString(R.string.biometric_description))
                    .setNegativeButtonText(getString(R.string.biometric_negative_button_text))
                    .build();
                //start authentication
                mBiometricManager.authenticate(new BiometricCallback() {
                    @Override
                    public void onSdkVersionNotSupported() {
                        Toast.makeText(getApplicationContext(), 
   getString(R.string.biometric_error_sdk_not_supported), 
  Toast.LENGTH_LONG).show();

                    }

                    @Override
                    public void onBiometricAuthenticationNotSupported() {
                        Toast.makeText(getApplicationContext(), getString(R.string.biometric_error_hardware_not_supported), Toast.LENGTH_LONG).show();

                    }

                    @Override
                    public void onBiometricAuthenticationNotAvailable() {
                        Toast.makeText(getApplicationContext(), getString(R.string.biometric_error_fingerprint_not_available), Toast.LENGTH_LONG).show();
                        startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0);


                    }

                    @Override
                    public void onBiometricAuthenticationPermissionNotGranted() {

                    }

                    @Override
                    public void onBiometricAuthenticationInternalError(String error) {

                    }

                    @Override
                    public void onAuthenticationFailed() {

                    }

                    @RequiresApi(api = Build.VERSION_CODES.M)
                    @Override
                    public void onAuthenticationCancelled() {
                        Intent intent = new Intent(getApplicationContext(), LocksWithoutKeystoreActivity.class);
                        startActivity(intent);
                        Toast.makeText(getApplicationContext(), getString(R.string.biometric_cancelled), Toast.LENGTH_SHORT).show();
                        mBiometricManager.cancelAuthentication();

                    }

                    @Override
                    public void onAuthenticationSuccessful() {
                        try {
                            Intent intent = new Intent(getApplicationContext(), MainDashBoardActivity.class);
                            startActivity(intent);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }

                    @Override
                    public void onAuthenticationHelp(int helpCode, CharSequence helpString) {

                    }

                    @Override
                    public void onAuthenticationError(int errorCode, CharSequence errString) {

                    }
                });

            }
        } else {
            shouldExecuteOnFirstTime = true;
        }
        }

    }

标签: androidandroid-lifecycle

解决方案


这是正常行为,我建议您参考 android活动片段生命周期:

在此处输入图像描述

在活动之间切换时,活动调用 onPause() 是正常的。您可能正在寻找更合适的 onStop() 或 onDestroy() 方法,尽管我怀疑您的底层设计可能存在缺陷(单独问题的主题)。我建议您重新表述您的问题,而是告诉我们您正在尝试实现什么样的行为,并包含您当前使用的代码。

如果您要在 Activity 中切换 Fragment,则应参考 Fragment 生命周期,该生命周期与它被膨胀到的 Activity 互连:

在此处输入链接描述

在这种情况下,您可能会发现即使底层 Activity 未更改,也会调用片段的 onPause()。这又是正常的行为。


推荐阅读