Android - 将融合位置更新记录到后台服务中的文件

时间:2016-09-22 06:41:31

标签: android

我尝试将未融合服务的融合位置更新记录到文件中,该服务在其自己的流程中运行':locationProcess'。

AndroidManifest.xm

<service
   android:name=".LocationUpdate"
   android:process=":locationProcess"
   android:enabled="true"
   android:exported="true" />

LocationUpdate.java

public class LocationUpdate extends Service implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {...

onBind设置为返回null

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

onStartCommand 返回START_STICKY。

我在LocationUpdate服务中的Google Play服务onConnected回调方法中创建文件...

@Override
public void onConnected(Bundle arg0) {

    try {
        pwFile = new PrintStream(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "gps.csv"));
        pwFile.println("date,latitude,longtitude,altitude,bearing,accuracy");
    } catch (IOException e) {
        // TODO: Handle the exception
    }

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    startLocationUpates();
}

并将 LocationListener 中的 onLocationChange 回调中的GPS详细信息写出来......

@Override
public void onLocationChanged(Location location) {
    currentLat = location.getLatitude();
    currentLng = location.getLongitude();

    // Get current date time
    Date newDate = new Date(System.currentTimeMillis());

    // Write lat and long out to a file
    pwFile.println(newDate.toString() + "," + String.format("%.6f", currentLat) + "," +
            String.format("%.6f", currentLng) + "," + String.format("%.4f", location.getAltitude()) + "," +
            String.format("%.4f", location.getBearing()) + "," + String.format("%.4f", location.getAccuracy()));
}

我正在启动我的Application类的onCreate覆盖服务...

public class App extends Application {
   Intent LocationService;

   @Override
   public void onCreate() {
       super.onCreate();

       LocationService = new Intent(this, LocationUpdate.class);
       startService(LocationService);
   }
}

这一切都有效, App <application>标签中声明:android:name =&#34; mypackage.app&#34; Manifest.xml。

这是没有......

的部分

即使前台有另一个应用程序,我希望服务继续将位置记录到文件中。

如果用户故意关闭应用程序,它应该停止记录。阅读Android文档后,我认为我的代码可以正常工作。

据我所知,当App不在前台时,服务会继续运行。如果用户专门关闭了我不想要的应用程序并且由于某种原因我不明白服务本身在应用程序运行时被破坏和重新创建,那么它将继续运行 onConnected ,以便有效地覆盖日志文件。

我猜这更像是一个架构问题。

基本上,我希望我的位置服务可靠地记录到文件,而App在启动后不在前台,并在用户终止App时停止。

希望是有道理的。我在Github上查看了很多样本​​,但是当应用程序位于前台时,它们似乎只是记录。

任何帮助都非常感激,这让我有点疯狂。

感谢。

1 个答案:

答案 0 :(得分:0)

您将服务作为Start服务(而不是Intent服务)。然后在onStartCommand of service上,返回START_STICKY。这将告诉操作系统,如果由于任何原因需要关闭服务,请在有足够资源时再次运行它。在您的情况下,当用户关闭活动/杀死应用程序时,服务进程将被终止,但通常会重新打开。