#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.
Чтобы лучше понять, загляните в этот документ