Значок GPS на панели инструментов исчез после одной минуты запуска backgroundservice - PullRequest
0 голосов
/ 14 мая 2019

Я прочитал несколько вопросов и ответил о 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 секунд, поэтому мне всегда нужна служба переднего плана.

1 Ответ

0 голосов
/ 14 мая 2019

Использовать ScheduledExecutorService

ScheduledExecutorService scheduleTaskExecutor ;



@Override
public int onStartCommand(Intent intent, int flags, int startId) {

     if (scheduleTaskExecutor == null) {
        scheduleTaskExecutor = Executors.newScheduledThreadPool(1);
        //every 5 second execution
        scheduleTaskExecutor.scheduleAtFixedRate(new fivesec(), 0, 5, TimeUnit.SECONDS);

    }
    return START_STICKY;
}

, затем:

 private class fivesec implements Runnable {
    public void run() {
      //all code that needs to be executed every five seconds
   }

}
...