【问题标题】:Android - location service not running in background, only when connected to the computerAndroid - 定位服务不在后台运行,仅在连接到计算机时
【发布时间】:2017-02-22 16:46:43
【问题描述】:

我创建了一个具有 LocationListener 的服务。 在片段中,我有一个广播接收器,它成功地从服务接收位置。当手机连接到我的电脑并且我按下“运行”(不是调试模式)时,一切正常。正如我在 Android Studio 的“运行”控制台中看到的那样,当手机屏幕关闭时,我会不断收到位置信息。

但是,当我断开手机与计算机的连接并关闭屏幕时,我停止接收位置更新。或者在它停止之前我只有一两个位置更新。然后,当再次打开屏幕时,服务开始发送位置更新。

我尝试在 Fragment 和服务上使用 WakeLock,但它似乎没有任何效果。

有人可以帮帮我吗!?... :,(

在我的服务中,我在 putExtra() 中设置了一个 ArrayList->String,其中包含一个纬度和一个时间戳,以便我可以查看 locationlistener 在屏幕锁定时是否更新了位置。在 Fragment 中,我将结果显示在视图中,以便我可以手动调试。

这是我的服务代码:

public class GpsService extends Service {

private LocationListener listener;
private LocationManager locationManager;
private Intent mIntent;

private ArrayList<String> latTimeArrayList = new ArrayList<>();

private PowerManager.WakeLock wakeLock;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    mIntent = new Intent("location_update");

    PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    wakeLock.acquire();

    return START_NOT_STICKY;
}

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

@Override
public void onCreate() {

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

            mIntent.putExtra("Latitude", location.getLatitude());
            mIntent.putExtra("Longitude", location.getLongitude());

            if(latTimeArrayList.size() < 10){

                latTimeArrayList.add(location.getLatitude() + " -> " + new Date());

            }else if(latTimeArrayList.size() == 10){
                mIntent.putExtra("latTimeArray", latTimeArrayList);
            }
            sendBroadcast(mIntent);
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    };

    //noinspection MissingPermission
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, listener);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, listener);

}

@Override
public void onDestroy() {
    super.onDestroy();
    if(locationManager != null){
        //noinspection MissingPermission
        locationManager.removeUpdates(listener);
        wakeLock.release();
    }
}

}

private BroadcastReceiver broadcastReceiver;
ArrayList<String> aString = new ArrayList<>();
private String mmtext = "";
TextView debugtext = (TextView) mView.findViewById(R.id.hasCompletedTrack);
int doagain = 0;
@Override
public void onResume() {
    super.onResume();

    if(broadcastReceiver == null){
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                try{
                    if (doagain == 0){
                        aString = (ArrayList<String>)intent.getExtras().get("latTimeArray");
                        if(aString != null || aString.size() != 0){

                            for (int i =0; i< aString.size(); i++){
                                mmtext += aString.get(i) + "\n";
                            }
                            doagain = 1;
                            debugtext.setText(mmtext);
                        }
                    }


                }catch(NullPointerException e){}

【问题讨论】:

    标签: java android service locationmanager locationlistener


    【解决方案1】:

    我找到了答案……

    我不得不在我的三星 Galaxy S6 edge 上关闭 PoweSaving 模式

    另外,在我的broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {

    那在我的 Fragment 中,我使用 Intent getExtra() 从我的服务中获得的每个位置更新都进行了一些位置计算(这不在我发布的代码中)。但是 onReceive() 仅在屏幕打开(未锁定)时触发。因此,我在片段中的计算从未被触发,只有在屏幕上时才会触发计算方法。

    我对此的解决方案是直接在我的服务中处理所有计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-27
      • 2020-05-14
      • 2015-09-11
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多