https://developer.android.com/guide/components/services.html#Foreground

даю сервис, который должен работать, когда активность находится в фоновом режиме, а также когда все приложение уничтожено.

Я звоню координаты местоположения в сервисе через каждые 1 минуту.

Однако, когда я пытаюсь это сделать, служба автоматически отключается через 12-15 минут.

Я хочу, чтобы служба работала бесконечно до тех пор, пока она не будет уничтожена в результате завершения действий при взаимодействии с пользователем.

Мой класс обслуживания выглядит следующим образом:

public class SensorService extends Service {
    public int counter=0; 
    public static final int NINTY_SECONDS = 90000; 
    public static Boolean isRunning = false;
    public LocationManager mLocationManager;
    public Get_Coordinates mLocationListener;
    public GetSharedPreference sharedPreference;
    @Override
    public void onCreate() {
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationListener = new Get_Coordinates(getApplicationContext());
        sharedPreference = new GetSharedPreference(getApplicationContext());
        startTimer();
        super.onCreate();
    }
    public SensorService(Context applicationContext) {
        super();
        Log.i("HERE", "here I am!");
    }

    public SensorService() {
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("EXIT", "ondestroy!");
        Intent broadcastIntent = new Intent("com.android.startBgService");
        broadcastIntent.putExtra("abc","abcd");
        sendBroadcast(broadcastIntent);
        stoptimertask();
    }

    private Timer timer;
    private TimerTask timerTask;
    long oldTime=0;
    public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer, to wake up every 1 second
        timer.schedule(timerTask, NINTY_SECONDS, NINTY_SECONDS); //
    }

    /**
     * it sets the timer to print the counter every x seconds
     */
    public void initializeTimerTask() {
        timerTask = new TimerTask() {
            public void run() {
               // Log.i("in Etro Sendor", "in timer ++++  "+ (counter++));
                if (Check_Internet_Con.isConnectingToInternet(getApplicationContext())) {

                    if (!isRunning) {
                        startListening();
                    }
                    try {
                        if (sharedPreference.getActiveUserId() > 0) {
                            mLocationListener.getLocation();
                            mLocationListener.insertCoordinatesInSqlite();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
    }

    /**
     * not needed
     */
    public void stoptimertask() {
        //stop the timer, if it's not already null
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public void startListening() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER))
                mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener, Looper.getMainLooper());

            if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER))
                mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener,Looper.getMainLooper());
        }
        isRunning = true;
    }
}

Вот мой манифест

<service
           android:name="com.lunetta.etro.e_tro.SensorService"
           android:enabled="true"></service>
       <service
           android:name="com.lunetta.etro.e_tro.SecondService"
           android:enabled="true" >
       </service>

       <receiver
           android:name=".SensorRestarterBroadcastReceiver"
           android:enabled="true"
           android:exported="true"
           android:label="RestartServiceWhenStopped">
           <intent-filter>
               <action android:name="com.android.startBgService" />
               <action android:name="android.intent.action.BOOT_COMPLETED" />
           </intent-filter>
       </receiver>

А вот и класс SensorRestarterBroadcastReceiver

public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!");
        context.startService(new Intent(context, SensorService.class));
        
    }
}

 rajahsekar03 нояб. 2017 г., 07:57
использовать сервис переднего планаstackoverflow.com/questions/6397754/...
 Samir Bhatt03 нояб. 2017 г., 08:07
Попробуйте с планировщиком заданий
 Saran Sankaran03 нояб. 2017 г., 07:56
Это может быть из-за пределов выполнения фона Android Odeveloper.android.com/about/versions/oreo/background.html
 Dilip03 нояб. 2017 г., 07:56
Вы пытались использовать START_REDELIVER_INTENT при возврате onStartCommand.

Ответы на вопрос(2)

https://developer.android.com/guide/components/bound-services.html

«Связанная служба обычно работает только тогда, когда она обслуживает другой компонент приложения, и не работает в фоновом режиме бесконечно».

Чтобы он работал бесконечно, вам нужно привязать сервис к компоненту пользовательского интерфейса, который существует бесконечно. Вы можете использовать уведомление Android. Это приоритетный сервис.

https://developer.android.com/guide/components/services.html#Foreground

Решение Вопроса

он перестанет работать, ознакомьтесь с новыми документами, созданными Google. Он полностью изменил то, как местоположение работает на производительность батареи, и да, это сильно повлияло на производительность. Я полностью изменил свое решение для очень конкретной задачи. Также прекратите использовать другие репо, которые утверждают, что они работают неправильно

Проверьте новые обновленные документы от Google

https://developer.android.com/training/building-location.html

Лучший способ реализовать то же требование - использовать более 60 тыс. Устройств и безупречно работать в зависимости от версии API Android с использованием JobService с версиями от 23 и выше и ниже с сервисом Background. Используйте API LocationProvider и API клиента провайдера местоположения соответственно.

С личным опытом я скажу это. Старый стиль использования кода позволяет разряжать батарею устройства за несколько часов, теперь мой код едва ли наносит ущерб, его потребление составляет всего около 15 процентов от общего использования в течение ночи. это большое изменение в потреблении.

 vikas singh03 нояб. 2017 г., 11:08
Спасибо за тонну Спас меня много трудолюбия ..
 Niraj Sanghani03 нояб. 2017 г., 08:05
Как я уже говорил, вам нужно очень тактично и квалифицированно реализовывать один и тот же код, вам нужно использовать JobService формы 23 и выше, для более старых вам нужно использовать и Exported Service.
 vikas singh03 нояб. 2017 г., 08:04
Итак, как мне добиться вашего пути, если есть какие-то шаги, которыми вы могли бы руководить меня, это будет очень полезно.

Ваш ответ на вопрос