簡體   English   中英

BroadCastReceiver.onReceive 是如何調用的?

[英]How is BroadCastReceiver.onReceive called?

當我單擊按鈕然后 wifiManager.startScan() 但是當我單擊多次時,它返回 false (具體:10 次,總是 4 true 和 6 false)。

我想連續掃描,但我現在不知道為什么以及如何解決它。 誰能告訴我它是如何工作的? 我認為它與線程有關,但沒有找到解決方案。

這是我的代碼:

    val wifiManager : WifiManager by lazy { this.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager}
    val wifiScanReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
            if (success) {
                Log.d("AAA onReceive", success.toString())
                scanSuccess(wifiManager)
            } else {
                Log.d("AAA onReceive", success.toString())
                scanFailure(wifiManager)
            }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        requestPermission()

        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
        registerReceiver(wifiScanReceiver, intentFilter)
        

        btn.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
              
                val check = wifiManager.startScan()

              
            }
        })

    }

    private fun requestPermission() {
        if(ContextCompat.checkSelfPermission(this.applicationContext,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
            if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)){

            }else{
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),100)
            }
        }
    }


    private fun scanSuccess(wifiManager: WifiManager) {

        val results = wifiManager.scanResults
        for (item  in results){
            if(!map.containsKey(item.SSID)){
                map.put(item.SSID,(Model(calculateDistance(item.level.toDouble(),item.frequency.toDouble()),1)))
            }else{
                map.put(item.SSID,(Model(map.get(item.SSID)?.sum!!+calculateDistance(item.level.toDouble(),item.frequency.toDouble()),
                                            map.get(item.SSID)?.times!!+1)))
            }

        }
        unregisterReceiver(wifiScanReceiver)
    }

    private fun scanFailure(wifiManager: WifiManager) {
        Log.d("AAA scanFailure", "-")
        unregisterReceiver(wifiScanReceiver)

    }
}

當我單擊按鈕然后 wifiManager.startScan() 但是當我單擊多次時,它返回 false (具體:10 次,總是 4 true 和 6 false)。

我想連續掃描,但我現在不知道為什么以及如何解決它。 誰能告訴我它是如何工作的? 我認為它與線程有關,但沒有找到解決方案。

這是我的代碼:

    val wifiManager : WifiManager by lazy { this.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager}
    val wifiScanReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
            if (success) {
                Log.d("AAA onReceive", success.toString())
                scanSuccess(wifiManager)
            } else {
                Log.d("AAA onReceive", success.toString())
                scanFailure(wifiManager)
            }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        requestPermission()

        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
        registerReceiver(wifiScanReceiver, intentFilter)
        

        btn.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
              
                val check = wifiManager.startScan()

              
            }
        })

    }

    private fun requestPermission() {
        if(ContextCompat.checkSelfPermission(this.applicationContext,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
            if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)){

            }else{
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),100)
            }
        }
    }


    private fun scanSuccess(wifiManager: WifiManager) {

        val results = wifiManager.scanResults
        for (item  in results){
            if(!map.containsKey(item.SSID)){
                map.put(item.SSID,(Model(calculateDistance(item.level.toDouble(),item.frequency.toDouble()),1)))
            }else{
                map.put(item.SSID,(Model(map.get(item.SSID)?.sum!!+calculateDistance(item.level.toDouble(),item.frequency.toDouble()),
                                            map.get(item.SSID)?.times!!+1)))
            }

        }
        unregisterReceiver(wifiScanReceiver)
    }

    private fun scanFailure(wifiManager: WifiManager) {
        Log.d("AAA scanFailure", "-")
        unregisterReceiver(wifiScanReceiver)

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM