Как выйти из режима сканирования ZXing при нажатии кнопки «Назад» - PullRequest
0 голосов
/ 27 января 2019

У меня есть простое приложение для сканирования QR-кода.Вот блок-схема, которая описывает его логику.enter image description here

И это основная часть:

import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

public class ScanActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan);
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentIntegrator scanIntegrator = new IntentIntegrator(ScanActivity.this);
        scanIntegrator.setOrientationLocked(false);
        scanIntegrator.initiateScan();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (scanResult != null){
            String strResult = scanResult.getContents();
            Intent iii = new Intent(ScanActivity.this, ScanResultActivity.class);
            iii.putExtra("scan_result", strResult);
            startActivity(iii);
        }
    }

    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }
}

Если вы находитесь в ScanActivity, то приложение сразу отобразит ScanResultActivity после сканирования, котороеожидается.Единственная проблема заключается в том, что приложение не будет закрываться при нажатии клавиши «Назад».Вместо этого он перейдет к ScanResultActivity.Конечно, результат сканирования равен нулю.

Как выйти из приложения, нажав клавишу «Назад» во время сканирования?

Полный код: https://github.com/anta40/QRScanDemo

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Проблема: Этот блок кода заставляет ваш код работать не так, как ожидалось

@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();
    }
}
0 голосов
/ 27 января 2019

этот метод

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

должен вызывать метод super, например,

@Override
public void onBackPressed() {
    super.onBackPressed();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...