Проблема: Этот блок кода заставляет ваш код работать не так, как ожидалось
@Override
protected void onResume() {
super.onResume();
IntentIntegrator scanIntegrator = new IntentIntegrator(ScanActivity.this);
scanIntegrator.setOrientationLocked(false);
scanIntegrator.initiateScan();
}
Потому что, когда вы нажимаете клавишу возврата из ScanResultActivity
,
[*] .onResume
метод ScanActivity
будет вызван после onActivityResult
.В это время обратный стек будет.
ScanActivity -> ScanResultActivity -> ScanActivity
Если вы нажмете клавишу возврата (текущая активность ScanActivity
), ScanResultActivity
будет отображаться, затем, если вы снова нажмете кнопку возврата (текущая активность ScanResultActivity
), шаг [*] повторится.Теперь ваше приложение будет повторяться снова и снова, и вы не сможете выйти из текущего backstack навсегда.
Решение: Вот мое решение для предложения:
[1] .Просто показать сканированиеэкран, когда ScanActivity
создается впервые и когда пользователи нажимают клавишу возврата из ScanResultActivity
.
[2]. Выход / завершение текущего обратного стека, если пользователи нажимают клавишу возврата на ScanActivity
.
public class ScanActivity extends AppCompatActivity {
private static final int REQUEST_CODE_SCAN_RESULT = 47;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
// Show scanning screen when ScanActivity first time created
showScanningScreen();
}
private void showScanningScreen() {
IntentIntegrator scanIntegrator = new IntentIntegrator(ScanActivity.this);
scanIntegrator.setOrientationLocked(false);
scanIntegrator.initiateScan();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_CODE_SCAN_RESULT) {
// Show scanning screen when users press back key from `ScanResultActivity`.
showScanningScreen();
} else {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanResult != null) {
String strResult = scanResult.getContents();
if (strResult != null) {
Intent iii = new Intent(ScanActivity.this, ScanResultActivity.class);
iii.putExtra("scan_result", strResult);
startActivityForResult(iii, REQUEST_CODE_SCAN_RESULT);
} else {
// Exit/finish current backstack when users press back key on ScanActivity
onBackPressed();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
@Override
public void onBackPressed() {
// Override this function to finish current backstack (default behavior is push current activity from backstack)
finishAffinity();
}
}