Проблема с последовательностью методов Java

#java #android

#java #Android

Вопрос:

Я создал некоторую функцию Java в MainActivity.java . Затем я добавляю несколько тостов, чтобы определить последовательность функций. И затем, последовательность функций сбивает с толку. onCreate() началось сначала, что совершенно нормально, за которым следует askCoarsePermission() . Затем происходит странная вещь, onResume() затем выполняется и переходит к вызову askBluetoothPermission() . Что происходит, askCoarsePermission() что он может вызвать onResume() ?

The sequence:
1. onCreate()
2. askCoarsePermission()
3. onResume()
4. askBluetoothPermission()
5. -- stops.. no functions is then being invoked --

Я попытался проверить, какая функция может вызывать onResume() , но ни одна из askCoarsePermission() не вызывала эту функцию.

Вот код для MainActivity.java:

пакет com.example.bluetoothscanexample;

 import android.app.ListActivity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResu<
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;


public class MainActivity extends ListActivity {

    private static int REQUEST_CODE_COARSE_PERMISSION = 1;
    private static int REQUEST_CODE_BLUETOOTH_PERMISSION = 2;

    // make scan period 10 seconds before starting the new one
    private static int SCAN_PERIOD = 100;

    private BluetoothManager mBluetoothManager;
    private BluetoothAdapter mBluetoothAdapter;
    private BluetoothLeScanner mBluetoothLeScanner;
    private com.example.bluetoothscanexample.adapter.BluetoothLeListAdapter mLeDeviceListAdapter;

    // No idea what is this lol
    private Handler mHandler;
    private boolean mScanning;

    private ScanCallback mBluetoothScanCallBack = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, final ScanResult result) {
            Toast.makeText(MainActivity.this, "onScanResult here...", Toast.LENGTH_LONG).show();
            super.onScanResult(callbackType, result);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mLeDeviceListAdapter.addDevice(result.getDevice());
                    mLeDeviceListAdapter.notifyDataSetChanged();
                }
            });
        }

        @Override
        public void onScanFailed(int errorCode) {
            Toast.makeText(MainActivity.this, "onScanFailed here...", Toast.LENGTH_LONG).show();
            super.onScanFailed(errorCode);
            Toast.makeText(MainActivity.this, "Scan Failed: Please try again...", Toast.LENGTH_LONG).show();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mHandler = new Handler();

        mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = mBluetoothManager.getAdapter();
        mLeDeviceListAdapter = new com.example.bluetoothscanexample.adapter.BluetoothLeListAdapter(this);

        // Add this line to make scanning work!!!
        mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();

        // check if this phone support Bluetooth Low Energy
        if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){
            Toast.makeText(this,"ble_not_supported",Toast.LENGTH_SHORT);
            finish();
        }
        Toast.makeText(MainActivity.this, "onCreate here..", Toast.LENGTH_LONG).show();
        askCoarsePermission();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        Toast.makeText(MainActivity.this, "onActivityResult here...", Toast.LENGTH_LONG).show();
        super.onActivityResult(requestCode,resultCode,data);

        if(requestCode == REQUEST_CODE_BLUETOOTH_PERMISSION){
            askCoarsePermission();
        }
        mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
        scanBluetoothDevices(true);
    }

    @Override
    protected void onResume(){
        Toast.makeText(MainActivity.this, "onResume here...", Toast.LENGTH_LONG).show();
        super.onResume();
        setListAdapter(mLeDeviceListAdapter);
        askBluetoothPermission();
    }

    @Override
    protected void onPause(){
        Toast.makeText(MainActivity.this, "onPause here...", Toast.LENGTH_LONG).show();
        super.onPause();
        mLeDeviceListAdapter.clear();
    }

    private void askCoarsePermission(){
        Toast.makeText(MainActivity.this, "askCoarsePermission here...", Toast.LENGTH_LONG).show();
        if(this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
            requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_CODE_COARSE_PERMISSION);
        }
    }

    private void askBluetoothPermission() {
        Toast.makeText(MainActivity.this, "askBluetoothPermission here...", Toast.LENGTH_LONG).show();
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_CODE_BLUETOOTH_PERMISSION);
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
        Toast.makeText(MainActivity.this, "onRequestPermissionResult here...", Toast.LENGTH_LONG).show();
        super.onRequestPermissionsResult(requestCode,permissions,grantResults);

        if(requestCode == REQUEST_CODE_COARSE_PERMISSION){
            Toast.makeText(this,"Coarse Permission Granted",Toast.LENGTH_LONG).show();
        }
    }

    private void scanBluetoothDevices(boolean enable){
        Toast.makeText(MainActivity.this, "scanBluetoothDevices here...", Toast.LENGTH_LONG).show();
        if(enable){
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothLeScanner.stopScan(mBluetoothScanCallBack);
                }
            }, SCAN_PERIOD);
            mScanning = true;
            mBluetoothLeScanner.startScan(mBluetoothScanCallBack);
        }else{
            mScanning = false;
            mBluetoothLeScanner.stopScan(mBluetoothScanCallBack);
        }
    }
}
  

Последовала еще одна проблема. Почему java останавливается на askBluetoothPermission() и никакая другая функция не запускается? Я здесь так запутан. Кто-нибудь, пожалуйста, просветите меня.

Ответ №1:

это обычный жизненный цикл Activity, сначала onCreate -> OnStart -> onResume.

Чтобы лучше понять, загляните в этот документ