gpt4 book ai didi

java - 如何在 sleep 模式下使用移动网络运行后台服务?

转载 作者:太空宇宙 更新时间:2023-11-04 09:34:40 24 4
gpt4 key购买 nike

我正在创建后台服务来更新位置。它在 sleep 模式下与 wifi 配合使用效果很好,但是当我在 sleep 模式下使用移动网络时,我的后台服务不会更新位置。我应该怎么做才能在 sleep 模式下使用移动网络运行后台服务?

我使用服务库并将位置更新到服务器。

import android.Manifest;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class LocationService extends Service {

double latitude=0f;
double longitude=0f;
private LocationManager locationManager = null;
int LOCATION_INTERVAL = 300000;
float LOCATION_DISTANCE = 0f;
public ServerHelper serverHelper = new ServerHelper();

@Override
public void onCreate() {
Log.d("onCreate: ", "create");
initializeLocationManager();

try {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
LOCATION_INTERVAL,
LOCATION_DISTANCE,
locationListeners[0]);

} catch (java.lang.SecurityException ex) {
} catch (IllegalArgumentException ex) {
}
}


@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d("onBind: ", "bind");
return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("onStartCommand: ", "startcommand");
super.onStartCommand(intent,flags,startId);
return START_STICKY;
}

@Override
public void onDestroy() {
Log.d("onDestroy: ", "destroy");
super.onDestroy();
if (locationManager != null) {
for (LocationListener locationListener : locationListeners)
{
try {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
locationManager.removeUpdates(locationListener);
} catch (Exception ex) {
}
}
}
}
private class LocationListener implements
android.location.LocationListener {
Location mLocation;
Calendar calendar;
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss",
Locale.getDefault());

@Override
public void onLocationChanged(Location location) {
Log.d("onLocationChanged: ", "locationChange");
calendar = Calendar.getInstance();
Date date = calendar.getTime();
String time = dateFormat.format(date);

mLocation.set(location);
latitude = location.getLatitude();
longitude = location.getLongitude();

String latlng = latitude+","+longitude;
serverHelper.updateLocation(getApplicationContext(),latlng,time);
}
@Override
public void onStatusChanged(String provider, int status, Bundle
extras) {
Log.d("onStatusChanged: ", "status");
}
@Override
public void onProviderEnabled(String provider) {
Log.d("onProviderEnabled: ", "proEnabled");
}
@Override
public void onProviderDisabled(String provider) {
Log.d("onProviderDisabled: ", "proDisabled");
}
LocationListener(String provider) {
mLocation = new Location(provider);
}
}
LocationListener[] locationListeners = new LocationListener[] {
//new LocationListener(LocationManager.GPS_PROVIDER),
new LocationListener(LocationManager.NETWORK_PROVIDER)
};
private void initializeLocationManager() {
if (locationManager == null) {
locationManager = (LocationManager)
getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
}
}
}

当我在 sleep 模式下使用移动网络时。 onLocationChanged 无法调用

最佳答案

您不应该使用后台服务来执行类似的操作。现代 Android 版本将在 15 分钟后终止该服务,并且除非您的应用程序在前台运行,否则您无法重新启动它。 Android 会尽力延长电池生命周期,您应该尽力支持它。

以下是可能的解决方案:

  1. 使用 AlarmManager 设置重复警报。 Android 可能会在某些情况下决定延迟闹钟,例如如果手机正在 sleep 。

  2. 使用 JobScheduler 安排更新位置的重复作业。这需要 Android L。

  3. 使用 Android Jetpack WorkManager。这结合了上述两种解决方案,并在幕后选择了最佳方法。这是首选解决方案。检查this page out了解如何安排重复性工作。

  4. 如果您确实想使用后台服务来持续更新位置,则需要通过在服务中调用 startForeground() 并传递通知来创建前台服务。只要您的服务正在运行,此通知就会向用户显示,但 Android 不会终止它。不建议使用此解决方案,因为它会更快地耗尽电池电量,并且用户会因为持续的通知而注意到。

主要模式是这样的:不要让您的应用保持运行,而是使用上述解决方案之一安排位置更新。在过去的几个版本中,Android 对后台服务变得非常严格,并强制您采用新的机制,通过终止后台服务并且不允许您重新启动它们,除非您的应用程序位于前台。这样可以节省电池。我建议每 15 分钟更新一次位置的频率不要超过。

关于java - 如何在 sleep 模式下使用移动网络运行后台服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56654429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com