Android-以固定的间隔从另一个服务调用系统服务。

正如问题所暗示的那样,我想知道如何编写一个可以调用系统服务的线程,然后等待一定时间,然后再调用该系统服务的函数,该函数从已注册的ѭ1回调回
onReceive
。 换句话说,我正在尝试在我的自定义服务中调用Wifi扫描服务(在
IntentFilters
中注册ѭ1so),以便可以获取当前的SSID。我知道我最终将对收到的数据进行处理,这与该问题无关。但是,在ѭ0certain内再次调用
startScan
之前,我需要等待一段时间,这就是我试图确定最佳操作方法的地方。 我设法在线程中以这种方式调用wifi扫描器:
    private Object _lock = new Object();

    private final long SLEEP_TIME = 15000; //Scan every 15 secs
    private final long WIFI_SCAN_TIMEOUT = 60000; //One minute timeout for getting called back, otherwise, initiate a new scan.

   @Override
    public void run() {
        while(running){
            //Start a new scan;
            wifiSearchComplete = false;
            _wifiMan.startScan();
            while(!wifiSearchComplete){
                synchronized(_lock){
                    try{
                        _lock.wait(WIFI_SCAN_TIMEOUT);
                    } catch (InterruptedException ie){
                         Log.d(TAG, TAG+\".run() caught \" + ie.getMessage() +\" when trying to sleep for \" + (WIFI_SCAN_TIMEOUT/1000) +\"secs.\");
                         Thread.currentThread().interrupt();
                    }
                }
                if(!wifiSearchComplete){
                    synchronized(_lock){
                        //Try scanning again since we didn\'t get called back at all;
                        _lock.notify();
                    }
                }
            }
        }
    }

    public boolean isRunning(){
        return running;
    }

    public void stop(){
        synchronized(_lock){
            running = false;
            //unregister receivers and cleanup
            _lock.notify();
        }
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        synchronized(_lock){
               wifiSearchComplete = true;
               //iterate through our SSID\'s
                try{
                    _lock.wait(SLEEP_TIME);
                } catch (InterruptedException ie){
                     Log.d(TAG, TAG+\".onReceive() caught \" + ie.getMessage() +\" when trying to sleep for \" + (SLEEP_TIME/1000) +\"secs.\");
                     Thread.currentThread().interrupt();
                }
                _lock.notify();
            }
    }
但是,即使它每隔15秒等待一次才再次扫描,当试图退出我的测试活动(调用
onDestroy
)时,它会在解除绑定服务之前阻塞主线程的睡眠时间。换句话说,这是尝试完成我想做的事而不阻塞的适当方法,还是我必须简单地创建一个
BroadcastReceiver
并在
onReceive
的末尾调用
Thread.sleep
,然后再调用开始新的扫描?     
已邀请:
您应该实现一个IntentService。在您的实现中,重写onHandleIntent()进行WiFi扫描。 接下来,使用AlarmManager安排每隔一定时间向IntentService发送一个Intent。设置自己的操作名称:\“ diago.intent.scan_wifi \”或类似的名称。如果您使用“不重复间隔”(例如15分钟)之一,则Android操作系统将同时安排所有其他服务,以最大程度地减少手机必须从睡眠模式中唤醒的次数。 最后,实现一个BroadcastReceiver以响应ACTION_BOOT_COMPLETED并调用您的代码来调度AlarmManager。这将在引导时启动您的服务。 这样,当AlarmManager发送意图时,将加载您的服务,执行扫描,然后退出。     

要回复问题请先登录注册