我已經創建了一個應用程序,其中用戶首先可以選擇將latitude
和longitude
添加到SQLite
數據庫,並在它們進入註冊區域時觸發Notification
。如何在進入半徑時僅使近程警報觸發一次?
之後,我添加了標記使用LatLng
保存在數據庫中。我已經使用通知來顯示警報。
問題:我的問題是,如果我在標記半徑內停留一段時間,它會繼續發射通知。
任何知道解決方案的人如果我進入鄰近地區並僅在重新進入該地區時再次啓動,纔會使其啓動一次。提前致謝。
我已經創建了一個應用程序,其中用戶首先可以選擇將latitude
和longitude
添加到SQLite
數據庫,並在它們進入註冊區域時觸發Notification
。如何在進入半徑時僅使近程警報觸發一次?
之後,我添加了標記使用LatLng
保存在數據庫中。我已經使用通知來顯示警報。
問題:我的問題是,如果我在標記半徑內停留一段時間,它會繼續發射通知。
任何知道解決方案的人如果我進入鄰近地區並僅在重新進入該地區時再次啓動,纔會使其啓動一次。提前致謝。
簡單的解決方案是隻是爲了節省您是否已經解僱的通知,然後重置它時,你,你是在禁區外第一時間通知:
bool notified = false;
if(inArea() && !notified)
notify();
notify = true;
else if(!inArea and notified)
notified= false;
計算圈之間的差別,中心點以及它存在:
Location locationA = new Location("point A");
locationA.setLatitude(latitude_center);
locationA.setLongitude(longitude_center);
Location locationB = new Location("point B");
locationB.setLatitude(lat_current);
locationB.setLongitude(lng_current);
float distance = locationA.distanceTo(locationB);
if(radius < distance){
// fire alert
}
你或許應該看看包括一定程度的hysterisis ......當你進入該地區,當你離開之間的重疊。您需要兩個半徑:當您進入目標區域時,較小的定義;當你離開它時,更大的定義。然後,將這些成類似Astrogat的回答了一句:
bool notified = false;
...
if(inArea(innerRadius) && !notified) {
notify();
notify = true;
} else if(!inArea(outerRadius) && notified) {
notified= false;
}
過於單一半徑的優點是,這會阻止你‘來’和‘走出去’之間切換,當你只是在邊緣目標區域。
另請注意,notified
變量需要持續保持對「我們應該通知」邏輯的調用。