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

У меня есть фоновая служба в моем приложении для Android, я запускаю службу из метода MainActivity onResume(), и она работает правильно. Но как я могу остановить службу, когда пользователь нажимает кнопку «Домой». Потому что в настоящее время, когда пользователь нажимает кнопку «Домой», приложение переходит в фоновый режим, а затем пользователь открывает какое-то другое приложение, затем через некоторое время вызывается мой метод службы, и приложение принудительно останавливается. Ниже приведен мой код для запуска службы -

Intent msgIntent = new Intent(mContext, MyBackgroundService.class);
        startService(msgIntent);

Заранее спасибо.

ОТРЕДАКТИРОВАНО

В My Service я использую код ниже -

 public void callAsynchronousTask() {
final Handler handler = new Handler();
timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {       
    @Override
    public void run() {
        handler.post(new Runnable() {
            public void run() {       
                try {
                    callWebservice();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
};
timer.schedule(doAsynchronousTask, START_DELAY, DELAY);
 }

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    callAsynchronousTask();
    return Service.START_NOT_STICKY;
}

@Override
public void onCreate() {
    mContext = this;
    super.onCreate();
}

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

@Override
public void onDestroy() {
    super.onDestroy();
    if(timer!=null){
        timer.cancel();
    }
    stopSelf();
}

в моей деятельности я использую приведенный ниже код для остановки службы -

@Override
protected void onStop() {
    try{
         stopService(new Intent(this, MyBackgroundService.class));
         isServiceRunning = false;
    }
   catch(Exception e){
    e.printStackTrace();
   }
    super.onStop();
}

@Override
protected void onPause() {
    try{
         stopService(new Intent(this, MyBackgroundService.class));
         isServiceRunning = false;
    }
    catch(Exception e){
        e.printStackTrace();
    }
    super.onPause();
}

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


person Ravi Bhandari    schedule 18.10.2014    source источник


Ответы (4)


Остановить службу в onPause() и onStop()

mContext.stopService(new Intent(mContext,
                     MyBackgroundService.class))
person Rohit    schedule 18.10.2014

когда мы открываем другие приложения, наше приложение (которое было в фоновом режиме) очищается из памяти. Однако все приложение не удаляется, но некоторые нежелательные данные и действия завершаются. В вашем случае действие, которое должно быть обновлено, очищается из памяти и вашей работающей фоновой службы при попытке обновить пользовательский интерфейс, после чего происходит сбой, вызывая исключение NullPointerException.

Поэтому, пожалуйста, сохраните ссылку на активность (чей пользовательский интерфейс должен быть обновлен) в onCreate() и установите ссылку на null в методе finish(), затем проверьте эту ссылку в фоновой службе, если она не равна нулю, затем обновите пользовательский интерфейс, в противном случае нет обновление.

// Global Class for saving the reference
class GlobalReference{
      public static <name_of_your_activity> activityRef;
}

в вашей деятельности

 onCreate(){
     GlobalReference.activityRef = this;
 }


finish(){
    GlobalReference.activityRef = null;
}

В вашей фоновой службе

if( GlobalReference.activityRef != null){
    // update the UI of your activity
}

Надеюсь, этот код решит вашу проблему. Удачного кодирования...

person user3676087    schedule 20.10.2014

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_HOME){
            Log.e("home key pressed", "****");   
            // write your code here to stop the activity
            enter code here
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onPause() {
        Log.e("home key pressed on pause", "****");
        // write your code here to stop your service 
        super.onPause();      
    }

приведенный выше код будет проверять, нажал ли пользователь кнопку «Домой» или нет.

person amit    schedule 18.10.2014
comment
Я попробовал ваш код, но когда нажата кнопка «Домой», метод onKeyDown не вызывается. - person Ravi Bhandari; 18.10.2014
comment
вы должны обновлять пользовательский интерфейс из фоновой службы, которая может вызывать сбой. если это так, вам нужно применить проверку для контекста вашей деятельности и сделать его нулевым для методов onPause и Onkey down, а затем перед обновлением пользовательского интерфейса проверьте его. - person amit; 18.10.2014

нажмите кнопку «Домой», чтобы вызвать функцию OnPause(). Переопределить onPause() и вызвать stopService: mContext.stopService(new Intent(mContext, MyBackgroundService.class))

person kemdo    schedule 18.10.2014
comment
Пожалуйста, проверьте обновленный вопрос. Потому что я пробовал ваш код, но приложение все еще аварийно завершает работу, когда приложение находится в фоновом режиме, а какое-то другое приложение работает. - person Ravi Bhandari; 18.10.2014