如何在后台运行locationlistener

编程入门 行业动态 更新时间:2024-10-25 00:25:46
本文介绍了如何在后台运行locationlistener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我想在我的应用程序上运行一个位置监听器,该监听器每隔10m或每5秒发送一次新的弹出式窗口".稍后,我会将数据发送到云中.

I would like to run a locationlistener on my app, that send after every 10m or every 5 seconds an new "Popup". Later I will send my data to the cloud.

这是我的GPSTracker课:

This is my GPSTracker class:

import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import android.util.Log; import android.widget.Toast; public class GPSTracker extends Service implements LocationListener { private final Context mContext; // flag for GPS status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS status boolean canGetLocation = false; Location location; // location double latitude; // latitude double longitude; // longitude // The minimum distance to change Updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 5 * 1; // 1 minute // Declaring a Location Manager protected LocationManager locationManager; public GPSTracker(Context context) { this.mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } /** * Stop using GPS listener * Calling this function will stop using GPS in your app * */ public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(GPSTracker.this); } } /** * Function to get latitude * */ public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } // return latitude return latitude; } /** * Function to get longitude * */ public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } // return longitude return longitude; } /** * Function to check GPS/wifi enabled * @return boolean * */ public boolean canGetLocation() { return this.canGetLocation; } /** * Function to show settings alert dialog * On pressing Settings button will lauch Settings Options * */ public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); // Setting Dialog Title alertDialog.setTitle("GPS is settings"); // Setting Dialog Message alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); // On pressing Settings button alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // on pressing cancel button alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // Showing Alert Message alertDialog.show(); } @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { Toast.makeText(GPSTracker.this,"Provider enabled by the user. GPS turned on",Toast.LENGTH_LONG).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public IBinder onBind(Intent arg0) { return null; } }

对于我的活动课,我做到了:

For my activityclass I have made this:

gps = new GPSTracker(MainActivity.this); double latitude2 = gps.getLatitude(); double longitude2 = gps.getLongitude();

我收到了数据,这行得通.但是现在我想在后台运行数据,因此当位置更改时,我可以实现一个将数据发送到云的功能.

I receive the data, this works. But now I want to run the data in the background so when the location is changed I can implement a function that sends my data to the cloud.

我尝试过:

private void startGPSTrackerInBackground() { new AsyncTask<Void,Void,String>() { @Override protected String doInBackground(Void... params) { String msg = "This message runs in background"; gps = new GPSTracker(MainActivity.this); if(!gps.canGetLocation()){ gps.showSettingsAlert(); }else{ gps = new GPSTracker(MainActivity.this); double latitude2 = gps.getLatitude(); double longitude2 = gps.getLongitude(); } return msg; } @Override protected void onPostExecute(String msg) { mDisplay.append(msg + "\n"); } }.execute(null, null, null); }

但是在此功能中,无法获取我的GPSTracker类的信息,有人想办法做到这一点吗?

But in this function it's not possible to get the information of my GPSTracker class, anyone an idea to make this possible?

推荐答案

创建一个独立的类,添加一个GPSTracker成员变量并将其传递到构造函数中.将任务包装在可以稍后调用的方法中:

Create an independent class, add a GPSTracker member variable and pass it in the constructor. Wrap your task in a method you can invoke later:

public class BackgroundGPSTracker() { GPSTracker tracker; public BackgroundGPSTracker(GPSTracker tracker) { this.tracker = tracker; } public void run() { new AsyncTask<Void,Void,String>() { @Override protected String doInBackground(Void... params) { // Do some background stuff. } @Override protected void onPostExecute(String msg) { // Do after work stuff } }.execute(null, null, null); } }

使用:

如果您这样创建GPSTracker:

If you create GPSTracker like this:

gps = new GPSTracker(MainActivity.this);

然后您启动将其传递给任务的活动:

Then you start the activity passing it to the task:

BackgroundGPSTracker bgGPSTracker= new BackgroundGPSTracker(gps); bgGPSTracker.run();

编辑

EDIT

使用成员变量存储最近的已知位置,并使用计时器安排更新时间:

Use a member variable to store last known location, and timer to schedule updates:

public class CampaignsDiscoverActivity extends Activity{ static final int QUERY_CAMPAINGS_DELAY = 30000;// milliseconds Location currentLocation; Timer timer; void restartTimer() { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { sendDataToServerOrWhatever(); } }, QUERY_CAMPAINGS_DELAY, QUERY_CAMPAINGS_DELAY); } void stopTimer() { if (timer != null) { timer.cancel(); timer = null; } } void sendDataToServerOrWhatever() { // Do some stuff using currentLocation }

设置位置更改的侦听器.引发位置更改后,请停止计时器,开始工作并重新启动它:

Set a listener for locations changes. when location changed is raised, stop the timer, do work and restart it:

void startGPSUpdates() { locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { stopTimer(); currentLocation = location; sendDataToServerOrWhatever(); } }; locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); // Initialize location. currentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (currentLocation == null) { currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } restartTimer(); }

要启动系统,只需调用startGPSUpdates.

To start the system just invoke startGPSUpdates.

当应用程序进入后台时,您应暂停监听器,并在前台进入时恢复:

You should pause listeners when app goes to the background and resume when foreground:

@Override public void onPause() { super.onPause(); if (applicationData.isLoggedIn()) { pauseLocationUpdates(); } } @Override public void onResume() { super.onResume(); if (applicationData.isLoggedIn()) { resumeLocationUpdates(); } } void pauseLocationUpdates() { locationManager.removeUpdates(locationListener); } void resumeLocationUpdates() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); }

我认为您应该对计时器执行相同的操作,但是我使用该计时器的应用尚未完成并经过全面测试,因此您可能会发现错误.

I think you should do the same with the timer, but the app where I'm using it is not finished and fully tested yet, so you might find bugs.

希望有帮助.

更多推荐

如何在后台运行locationlistener

本文发布于:2023-11-27 10:15:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1637660.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:后台   如何在   locationlistener

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!