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
,然后再调用开始新的扫描?
没有找到相关结果
已邀请:
1 个回复
讹巳漓把备