android - 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;
}
}
}
解决方案
这是正常行为,我建议您参考 android活动和片段生命周期:
在活动之间切换时,活动调用 onPause() 是正常的。您可能正在寻找更合适的 onStop() 或 onDestroy() 方法,尽管我怀疑您的底层设计可能存在缺陷(单独问题的主题)。我建议您重新表述您的问题,而是告诉我们您正在尝试实现什么样的行为,并包含您当前使用的代码。
如果您要在 Activity 中切换 Fragment,则应参考 Fragment 生命周期,该生命周期与它被膨胀到的 Activity 互连:
在这种情况下,您可能会发现即使底层 Activity 未更改,也会调用片段的 onPause()。这又是正常的行为。
推荐阅读
- spring - 如何将 spring.io 集成到 wordpress 中?
- php - 下载大文件时,GuzzleHttp 客户端速度非常慢
- c# - 在 Windows 上连接到由 xcuitrunner 启动的 iOS WebDriverAgent 会话
- swift - 如何在快速点击按钮时删除表格视图单元格中的特定行
- c - 我不能 typedef 指向已经 typedef 的结构的指针
- python - 检查字符串中是否出现字符串列表的最短方法
- java - 如何使用 JPA 将 db 表放入 DTO 中的属性中
- c# - SQL - 用“where”子句连接三个表
- php - 用 ?? 替换(换行符)加上两个随机字符 在字符串中
- laravel - 为 laravel 安装了代客,但为什么 dnsmasq 不能正确解析?