在设备锁定时保持Android应用程序运行

在设备锁定时保持Android应用程序运行,android,service,location,locationmanager,Android,Service,Location,Locationmanager,正如标题所说,当我的设备处于锁定或睡眠状态时,我需要在android设备上运行我的应用程序。我的问题是,我正在记录GPS坐标,当它在睡眠模式下运行时,应用程序会停止。我试图创建一个服务,但我真的不明白它是如何工作的。我已经检查了我在谷歌或这个论坛上找到的几乎每一篇文章,但我发现的代码总是不完整的。我不想复制粘贴我想了解的所有内容。因此,关于如何运行locationmanager as服务以恢复当前位置的完整教程将非常有用:) 格里茨 [编辑]: 好的,我已经研究了FusedLocationPro

正如标题所说,当我的设备处于锁定或睡眠状态时,我需要在android设备上运行我的应用程序。我的问题是,我正在记录GPS坐标,当它在睡眠模式下运行时,应用程序会停止。我试图创建一个服务,但我真的不明白它是如何工作的。我已经检查了我在谷歌或这个论坛上找到的几乎每一篇文章,但我发现的代码总是不完整的。我不想复制粘贴我想了解的所有内容。因此,关于如何运行locationmanager as服务以恢复当前位置的完整教程将非常有用:)

格里茨

[编辑]:

好的,我已经研究了FusedLocationProvider,这就是我对它的理解:

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;

import android.app.Service;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class GPSService extends Service implements LocationListener, ConnectionCallbacks, OnConnectionFailedListener, com.google.android.gms.location.LocationListener {

private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private boolean requestingLocationUpdate=true;

private double latitude;
private double longitude;

@Override
public IBinder onBind(Intent intent) {
    return null;
    }
@Override
public void onCreate() 
{
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d("GPSService", "onCreate");

    mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build();
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

@Override
public void onDestroy() 
{
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d("GPSService", "onDestroy");
    mGoogleApiClient.disconnect();
}

@Override
public void onStart(Intent intent, int startid) 
{
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d("GPSService", "onStart");
    mGoogleApiClient.connect();
}

@Override
public void onLocationChanged(Location loc) {
    updateContent(loc);
}

private void updateContent(Location loc)
{
    Toast.makeText(this, "Location changed", Toast.LENGTH_SHORT).show();
    latitude = loc.getLatitude();
    longitude = loc.getLongitude();
}


@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}
@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onConnected(Bundle arg0) {
    if(requestingLocationUpdate)
    {
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,this);
        Toast.makeText(this, "Started the location update", Toast.LENGTH_LONG).show();
    }
}
@Override
public void onConnectionSuspended(int arg0) {
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);
}


}
这很好,当我的应用程序在后台运行并且位置发生变化时,我会收到祝酒辞。我接下来的步骤是将坐标发送回我的主要活动。广播接收机就是从这里进来的吗


Greetz

首先,尝试查看fusedLocationProviderAPI。这建立在新的GoogleAppClient及其提供的服务之上

至于教程,我将给你一个简短的片段


基本概念是在应用程序中注册“侦听”特定服务的BroadcastReceiver。就代码而言,最好在文档或开发者网站提供的众多示例中查找这些代码

广播接收器就位后,您将使用requestLocationUpdates()提供的方法签名之一发出PendingEvents

还有其他细节,但从这些想法开始,看看文档

编辑:


如果您希望存储大量坐标,那么使用中间存储系统(如Sqlite数据库)将是一个很好的起点。如果要更新视图,则必须对活动执行某种回调。

我将GPS坐标保存在特殊的XML文件中,稍后需要使用该文件(必须是XML,但您是对的),Sqlite将是一个更好的开始。一旦我在MainActivity中收到坐标,我就将它们写入xml文件,我想给用户一些反馈,让他知道设备实际上正在记录一些东西。所以我必须把坐标“发送”给它。你提到了回拨。你能解释一下你的确切意思吗?或者给我一些更多的信息,我可以开始我自己的研究。基本概念是你有一个界面。然后,该接口由需要更新的所有类实现,以获取新数据。将对该类的引用交给GPSLogger类@另外,请考虑将GPS方法移到严格的模型类中。实现一个服务会脱离主线程,如果你得到很多分数,你会让自己慢下来很多。好的,我解决了广播接收器的问题。谢谢你的帮助,它正在工作。如果我的答案帮助解决了你的问题,请在答案旁边用不透明的复选标记将其标记为已解决。很高兴它起作用了。不客气