我正在开发我的顶点,我们正在开发一个获取用户位置的应用程序,并将其绘制在地图上。我们试图获取每个x变量的位置(x是用户从5,10,15,30和60分钟的选择中输入的设置)并将最佳位置发送到数据库以便稍后共享。应用程序基本流程是,每次用户打开应用程序时,他们都会看到地图并尽快显示其当前位置。然后将该位置发送到数据库以与其他人共享。在他们获得位置后,启动计时器,再次获取他们的位置,让他们说他们想要30分钟,然后将该位置发送到DB并再次启动计时器。每次用户访问应用程序时,计时器都需要重置,因为他们会在启动应用程序时立即获取其位置。我遇到的问题是在后台创建一个计时器,它将获取它们的位置,而不是在应用程序中发送到数据库。我还希望实现逻辑,在我们得到它们的位置之后,我们停止在一小段时间内收听更新。
我目前了解requestLocationUpdates()方法并实现了它,以便当用户访问应用程序时,他们从GPS和NETWORK获得一个位置,它的最小时间为60秒,距离为100英尺或30.48米。当用户暂停应用程序时,这也会停止,并在用户导航回应用程序时启动。我注意到,尽管我们已经收到更新,但我们仍在不断请求更新。这使我相信requestLocationUpdates在监听更新更改时继续使用电池寿命。
如何创建此逻辑以在收到位置后停止更新,然后在一定时间后开始侦听某个位置?读取requestLocationUpdates的当前android方法,minTime和minDistance只是“提示”但它不遵守它们。我需要locationUpdater来遵守设置参数。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/** Session Creation and Checker */
session = new SessionManagement(getApplicationContext());
// Check if the user is logged in
session.checkLogin();
/** Setup basic session and content view */
// Set the Content View
setContentView(R.layout.activity_main);
/** Start of the MapView Elements */
// extract MapView from layout
mapView = (MapView) findViewById(R.id.mapview);
// Set a mapController
mapController = mapView.getController();
// set the map to have built in zoom controls
mapView.setBuiltInZoomControls(true);
/** Getting the device location */
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
geoCoder = new Geocoder(this);
isEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// Check if the GPS is enabled
if (!isEnabled) {
alert.showAlertDialog(MainActivity.this, 12);
}
// Retrieve a list of location providers that have fine accuracy, no
// monetary cost, etc
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_HIGH);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
provider = locationManager.getBestProvider(criteria, true);
// If no suitable provider is found, null is returned.
if (provider != null) {
provider = locationManager.getBestProvider(criteria, false);
BCT = (session.getBCT() * 60000);
// Initialize with last known location
locationManager.requestLocationUpdates(provider, BCT, 31,
locationListener);
// Check the map settings
if (session.isSatellite()) {
SatelliteChecked = true;
mapView.setSatellite(true);
}
if (session.isTraffic()) {
TrafficChecked = true;
mapView.setTraffic(true);
}
} else {
alert.showAlertDialog(getApplicationContext(), 15);
locationManager.removeUpdates(locationListener);
}
}
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location
// provider.
Toast.makeText(getApplicationContext(), location.toString(),
Toast.LENGTH_LONG).show();
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
Toast.makeText(getApplicationContext(), provider.toUpperCase() + " enabled.", Toast.LENGTH_SHORT).show();
}
public void onProviderDisabled(String provider) {
Toast.makeText(getApplicationContext(), provider.toUpperCase() + " disabled.", Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onResume() {
super.onResume();
BCT = (session.getBCT() * 60000);
// when our activity resumes, we want to register for location updates
locationManager.requestLocationUpdates(
provider, BCT, 31, locationListener);
}
@Override
protected void onPause() {
super.onPause();
// when our activity pauses, we want to remove listening for location
// updates
locationManager.removeUpdates(locationListener);
}
答案 0 :(得分:0)
您需要的是计时器的后台主题。
你可以尝试:postDelayed
x分钟,如http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,长)因为这是你的顶点项目,所以我不想发出太多代码。但我可以更详细地解释后台主题:
现在你的时间都在前台完成,这意味着除非打开应用程序,否则计时器不会滴答作响。你需要做的是让你的计时器在后台线程中。这是一个由操作系统管理的线程,即使您的应用程序未运行,该线程仍在运行。既然你是为一个项目而不是为商业项目做这个,我会建议你采用Handler方法。像这样:
//make instance variable of the time the user chose, say... delayInMinutes
int delayInMinutes;
...
//then whenever you want to start the timer...
final Runnable updateLocation = new Runnable() {
public void run() {
//
... do your update location here
//
}
};
handler.postDelayed(updateLocation, delayInMinutes * 60 * 1000);
这应该有用
答案 1 :(得分:0)
这是使用alarms和IntentService的完美情况。启动IntentService,并将重复警报设置为用户所需的时间间隔,并让IntentService处理位置更新。
这些都是在后台完成的,你不需要运行任何东西。