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

Keep Android App running while device is locked

正如标题所说,当我的设备处于锁定或睡眠状态时,我需要 运行 在我的 android 设备上运行我的应用程序。我的问题是我正在记录 GPS 坐标,应用程序在进入睡眠模式时停止。我试图创建一项服务,但我真的不明白它是如何工作的。我几乎检查了我在 Google 或这个论坛上找到的每一篇文章,但我找到的代码总是不完整。我不想复制和粘贴我想了解的所有内容。因此,有关如何 运行 将位置管理器作为服务来获取当前位置的完整教程会很棒 :)。

问候

[编辑]:

好的,我查看了 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 进来的地方吗?

问候

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

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

基本概念是您在应用程序中注册一个 BroadcastReceiver "listens" 用于某些服务。就代码而言,您最好在文档或开发人员站点必须提供的众多示例中查找它。

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

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

编辑:

如果您希望存储大量坐标,使用像 Sqlite 数据库这样的中间存储系统将是一个不错的起点。如果您要接收更新视图,则必须对 activity.

实施某种回调