Я прочитал несколько вопросов и ответил о Foreground Service на Stackoverflow
.Они сказали, что передний план всегда включен и никогда не убивает системой.Но когда я внедряю свой проект и начинаю запускать службу, активен значок GPS
, и я закрываю приложение, а через одну минуту значок GPS
исчезает.Это значит, что мой GPS
не активен или как?После этого я снова открываю приложение, и значок GPS
снова активен.
сначала я попытался изменить значение с startService
на startForegroundService
на моем MainActivity
.Но ничего не меняется.Стоит ли реализовывать WakeLock
в моем проекте?
public class LocationService extends Service {
private final LocationServiceBinder binder = new LocationServiceBinder();
private final String TAG = LocationService.class.getSimpleName();
private LocationListener mLocationListener;
private LocationManager mLocationManager;
public Socket mSocket;
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
SocketApplication application = (SocketApplication) getApplication();
mSocket = application.getSocket();
mSocket.connect();
return START_STICKY;
}
@Override
public void onCreate() {
startForeground(12345678, getNotification());
}
private class LocationListener implements android.location.LocationListener {
private final String TAG = "LocationListener";
private Location mLastLocation;
public LocationListener(String provider)
{
mLastLocation = new Location(provider);
}
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
latitude = mLastLocation.getLatitude();
longitude = mLastLocation.getLongitude();
bearing = mLastLocation.getBearing();
speed = mLastLocation.getSpeed();
try {
javaToJson();
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onProviderDisabled(String provider) {
Log.e(TAG, "onProviderDisabled: " + provider);
Toast.makeText(getApplicationContext(), "Please turn on your GPS Location", Toast.LENGTH_LONG).show();
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
private void javaToJson() throws JSONException {
mSocket.emit("incoming", jsonFinal);
Log.i(TAG, jsonFinal);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mLocationManager != null) {
try {
mLocationManager.removeUpdates(mLocationListener);
} catch (Exception ex) {
Log.i(TAG, "fail to remove location listeners, ignore", ex);
}
}
}
private void initializeLocationManager() {
if (mLocationManager == null) {
mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
}
}
public void startTracking() {
initializeLocationManager();
mLocationListener = new LocationListener(LocationManager.GPS_PROVIDER);
try {
int LOCATION_INTERVAL = 1000;
long LOCATION_DISTANCE = 1;
mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, mLocationListener );
} catch (java.lang.SecurityException ignored) {
} catch (IllegalArgumentException ignored) {
}
}
public void stopTracking() {
this.onDestroy();
mSocket.disconnect();
}
private Notification getNotification() {
NotificationChannel channel = new NotificationChannel("channel_01", "My Channel", NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
if (notificationManager != null) {
notificationManager.createNotificationChannel(channel);
}
Notification.Builder builder = new Notification.Builder(getApplicationContext(), "channel_01").setAutoCancel(true);
return builder.build();
}
public class LocationServiceBinder extends Binder {
public LocationService getService() {
return LocationService.this;
}
}
}
Поскольку этот проект должен генерировать сокет каждые 5 секунд, поэтому мне всегда нужна служба переднего плана.