0

It kills the service when app is killed. Is there any way to keep the service running on backgroud after the app killed for the android nougat.

Please find the below code: it's running well for marshmellow.

package com.example.espl.pluzpluz.locationService;

import static android.support.v4.app.NotificationCompat.PRIORITY_MAX;

public class MyService extends Service
{
    static final int NOTIFICATION_ID = 543;

    public static boolean isServiceRunning = false;

    SharedPreferences sharedPref;
    JSONArray jsonArray;

    private static final String TAG = "BOOMBOOMTESTGPS";
    private LocationManager mLocationManager = null;

    private static final int LOCATION_INTERVAL = 1000;
    private static final float LOCATION_DISTANCE =0 ; 

    private class LocationListener implements android.location.LocationListener
    {

        Location mLastLocation;

        public LocationListener(String provider)
        {
           Log.e(TAG, "LocationListener " + provider);
            mLastLocation = new Location(provider);
        }

        @Override
        public void onLocationChanged(Location location)
        {
            Log.e(TAG, "onLocationChanged: " + location);
            mLastLocation.set(location);
            sharedPref = getApplicationContext().getSharedPreferences(
                    getString(R.string.preference_file_key), Context.MODE_PRIVATE);
            String jsonString = sharedPref.getString(getString(R.string.jsonString),"");

                try {
                    jsonArray=new JSONArray(jsonString);
                } catch (JSONException e) {
                   e.printStackTrace();
                }
                JSONObject jsonObject=new JSONObject();
                try {
                    jsonObject.put("lat",String.valueOf(location.getLatitude()));
                    jsonObject.put("long",String.valueOf(location.getLongitude()));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                jsonArray.put(jsonObject);

            sharedPref = getApplicationContext().getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putString(getString(R.string.jsonString),jsonArray.toString());
            editor.commit();

            System.out.println("jsonString"+jsonString);
        }

        @Override
        public void onProviderDisabled(String provider)
        {
   Log.e(TAG, "onProviderDisabled: " + provider);
        }

        @Override
        public void onProviderEnabled(String provider)
        {
           Log.e(TAG, "onProviderEnabled: " + provider);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras)
        {
            Log.e(TAG, "onStatusChanged: " + provider);
        }
    }

    LocationListener[] mLocationListeners = new LocationListener[] {
            new LocationListener(LocationManager.GPS_PROVIDER),
            new LocationListener(LocationManager.NETWORK_PROVIDER)
    };

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



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

        Log.e(TAG, "onStartCommand");
        super.onStartCommand(intent, flags, startId);
        if (intent != null && intent.getAction().equals("start_service")) { C.ACTION_START_SERVICE
            startServiceWithNotification();
        }else if(intent != null && intent.getAction().equals("stop_service")){
            stopMyService();
        }

        return START_STICKY;
    }

    void stopMyService() {

        stopForeground(true);
        stopSelf();
        isServiceRunning = false;
    }


    public void onCreate()
    {

        startServiceWithNotification();

        Log.e(TAG, "onCreate");
        initializeLocationManager();
        try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                    mLocationListeners[1]);
        } catch (SecurityException ex) {
            Log.i(TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "network provider does not exist, " + ex.getMessage());
        }
        try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                    mLocationListeners[0]);
        } catch (SecurityException ex) {
            Log.i(TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "gps provider does not exist " + ex.getMessage());
        }
    }


    void startServiceWithNotification() {
        if (isServiceRunning) return;
        isServiceRunning = true;


        Intent notificationIntent11 = new Intent(this, DashboardActivity.class);
        notificationIntent11.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        notificationIntent11.setAction("action_main");  
        notificationIntent11.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent contentPendingIntent11 = PendingIntent.getActivity(this, 0, notificationIntent11, 0);


        Notification notification0 = new NotificationCompat.Builder(this)
                .setGroup("12345")
                .setGroupSummary(true)
                .setContentIntent(contentPendingIntent11)
                .setSmallIcon(android.R.drawable.ic_dialog_email)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        android.R.drawable.ic_dialog_email))
                .setContentTitle("Bundled Notifications Content Title")
                .setContentText("Content Text for group summary")
                .setStyle(new NotificationCompat.InboxStyle()
                        .setSummaryText("This is my inbox style summary."))
                .setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary))
                .setVibrate(new long[]{800, 800, 800, 800})
                .setDefaults(Notification.DEFAULT_SOUND)
                .setOngoing(true)
                .setDeleteIntent(contentPendingIntent11)
                .setPriority(PRIORITY_MAX)
                .build();

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notification0.flags = notification0.flags | Notification.FLAG_NO_CLEAR;
        notification0.flags |= Notification.FLAG_FOREGROUND_SERVICE;
        notification0.flags |= Notification.FLAG_ONGOING_EVENT;

        startForeground(NOTIFICATION_ID, notification0);
    }



    @Override
    public void onDestroy()
    {
      Log.e(TAG, "onDestroy");
        super.onDestroy();
        if (mLocationManager != null) {
            for (int i = 0; i < mLocationListeners.length; i++) {
                try {
                    mLocationManager.removeUpdates(mLocationListeners[i]);
                } catch (Exception ex) {
                   Log.i(TAG, "fail to remove location listners, ignore", ex);
                }
            }
        }
    }


    private void initializeLocationManager() {
 Log.e(TAG, "initializeLocationManager");
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        }
    }


}
Jon B
  • 51,025
  • 31
  • 133
  • 161
Pradip Tilala
  • 1,715
  • 16
  • 24
  • 1
    Please format your code. Its a mess now. – greenapps Feb 24 '18 at 11:57
  • Possible duplicate of [Foreground service not receiving location updates in Android 7.0+ when screen is off](https://stackoverflow.com/questions/48509117/foreground-service-not-receiving-location-updates-in-android-7-0-when-screen-is) – krishank Tripathi Feb 24 '18 at 12:37
  • I fixed some of your code formatting, but you need to slim this down to a much smaller sample. – Jon B Feb 24 '18 at 14:14

0 Answers0