在设备锁定时保持Android App运行

时间:2015-07-02 14:51:34

标签: android service location locationmanager

因为标题说我需要在我的设备锁定或睡眠时在我的Android设备上运行我的应用程序。我的问题是我正在记录GPS坐标,当应用程序进入睡眠模式时,应用程序停止。我试图创建一个服务,但我真的不明白这是如何工作的。我几乎检查了我在谷歌或这个论坛上发现的所有文章,但我找到的代码总是不完整的。我不想复制&粘贴我想要理解的一切。因此,如何运行位置管理器作为服务以获取当前位置的完整教程将是很好的:)。

格尔茨

[编辑]:

好的,我已经查看了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);
}


}

这很好用,当我的应用程序在后台运行并且位置发生变化时,我会收到一个祝酒词。我接下来的步骤是将坐标发送回MainActivity。这是BroadcastReceiver的用武之地吗?

格尔茨

1 个答案:

答案 0 :(得分:0)

首先,请尝试查看FusedLocationProvider API。这建立在新的GoogleApiClient及其中提供的服务之上。

就教程而言,我会给你一个简短的小片段。

基本概念是您在应用程序中注册一个“侦听”某些服务的BroadcastReceiver。就代码而言,最好通过在文档或开发人员站点提供的众多示例中查找此内容。

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

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

编辑:

如果您希望存储大量坐标,那么使用像Sqlite数据库这样的中间存储系统将是一个很好的起点。如果您正在接收更新视图,那么您必须对您的活动实施某种回调。