Запрос Android на сервер перед полным закрытием приложения

У меня есть только одно Activity , когда пользователь закрывает приложение (из ясного списка последних приложений), я хочу отправить запрос на API моего сервера и изменить статус пользователя. поэтому я делаю IntentService и вызываю его в своем методе onDestroy(), но он не работает. как это сделать? есть ли еще способ сделать это (отправить запрос на сервер до того, как приложение будет полностью уничтожено)? мой код:

Мероприятия:

@Override
protected void onDestroy() {
    Intent intent = new Intent(this, MakeOfflineIntentService.class);
    intent.putExtra(Variables.INTENT_TOKEN, Token);
    intent.setAction("ACTION_MAKE_OFFLINE");
    startService(intent);
    super.onDestroy();
}

и в моем IntentService:

public class MakeOfflineIntentService extends IntentService {

private static final String ACTION_MAKE_OFFLINE = "ACTION_MAKE_OFFLINE";

private static final String EXTRA_TOKEN = Variables.INTENT_TOKEN;

public MakeOfflineIntentService() {
    super("MakeOfflineIntentService");
}

public static void startActionFoo(Context context, String param1) {
    Intent intent = new Intent(context, MakeOfflineIntentService.class);
    intent.setAction(ACTION_MAKE_OFFLINE);
    intent.putExtra(EXTRA_TOKEN, param1);
    context.startService(intent);
}

@Override
protected void onHandleIntent(Intent intent) {
    if (intent != null) {
        final String action = intent.getAction();
        if (ACTION_MAKE_OFFLINE.equals(action)) {
            final String param1 = intent.getStringExtra(EXTRA_TOKEN);
            retrofitBaseInformationChange(param1,Variables.OFFLINE,1);
        }
    }
}

private void retrofitBaseInformationChange(final String Token, final int online, int vehicle){
    RetrofitCallServer retrofitCallServer = new RetrofitCallServer(WebServiceUrls.RETROFIT_INFORMATION_CHEETAH_MAN);
    OnCallBackRetrofit onCallBackRetrofit = retrofitCallServer.getResponse();

    Call<OBRbaseInfromationChange> call = onCallBackRetrofit.askBaseInformationChange(Token,online,vehicle);
    call.enqueue(new Callback<OBRbaseInfromationChange>() {

        @Override
        public void onResponse(Call<OBRbaseInfromationChange> call, Response<OBRbaseInfromationChange> response) {
            /*response gotten maybe success or not*/
            if (response.isSuccessful()){
                OBRbaseInfromationChange obr = response.body();
                if(obr.code == 200){
                    Log.i(Variables.APP_TAG,"BaseInformationChange successful");
                }
                else{
                    Log.i(Variables.APP_TAG,"BaseInformationChange error code: "+obr.code);
                }
            }// end if response successful
            else {
                Log.i(Variables.APP_TAG,"BaseInformationChange not Successful: "+response.code());
            }
        }

        @Override
        public void onFailure(Call<OBRbaseInfromationChange> call, Throwable t) {
            /*our request not sent or conversion problem*/
            Log.i(Variables.APP_TAG,"onFailure BaseInformationChange: "+t.getMessage());
        }

    });
}
// end retrofitBaseInformationChange()

}

и, наконец, вот в моем манифесте:

<service
        android:name=".Services.MakeOfflineIntentService"
        android:exported="false"
        android:stopWithTask="false"/>

person Mohammad Hadi    schedule 06.09.2017    source источник


Ответы (2)


Вы пытались вернуть START_STICKY в переопределении onStartCommand?

После того, как вы отправили свой запрос, вы можете позвонить stopService, чтобы остановить себя.

Насколько я знаю, даже липкие сервисы могут быть «воссозданы», когда вы убиваете приложение. Так что, возможно, Intent — не лучший способ использовать здесь.

Я бы пошел с SharedPreferences здесь:

  • onCreate вашего приложения устанавливает для ключа "app_offline" значение "false"

  • onDestroy устанавливает для этого ключа значение «true» и запускает службу.

  • Служба START_STICKY, и когда она находит «app_offline» как true, отправляет свой запрос, обновляет «app_offline» до false (сбрасывает его), а затем выполняет самоотключение.

Что-то такое. Надеюсь, это поможет, ура, Грис

person Grisgram    schedule 06.09.2017
comment
Я не использовал START_STICKY раньше, дайте мне погуглить и попробовать. Благодарность - person Mohammad Hadi; 06.09.2017
comment
спасибо за вашу помощь, я решил это в тот же день, это помогает, теперь я скопирую часть своего кода здесь для более полного ответа - person Mohammad Hadi; 14.09.2017

спасибо за ответ Grisgram, я решаю проблему и вставляю свой код здесь для более полного ответа:

Я делаю переменную в SharedPreferences с именем IS_APP_CLOSED. когда приложение открывается в onCreate:

saveL.saveInLocalStorage(Variables.IS_APP_CLOSED,false);
    startServiceToMakeOffline();

метод startServiceToMakeOffline():

private void startServiceToMakeOffline(){
    Intent intent= new Intent(this, MakeOfflineService.class);
    startService(intent);
}

в onDestroy этого действия:

@Override
protected void onDestroy() {
    saveL.saveInLocalStorage(Variables.IS_APP_CLOSED,true);
    super.onDestroy();
}

и вот мой класс обслуживания:

public class MakeOfflineService extends Service {

private boolean isAppClosed = false;

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

    loadInfoFromLocalStorage();
    if(isAppClosed){
        askServer();
    }

    return Service.START_STICKY;

}

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

private void loadInfoFromLocalStorage() {
    SharedPreferences prefs = getApplicationContext().getSharedPreferences(Variables.CHEETAH_NORMAL, 0);
    isAppClosed     = prefs.getBoolean(Variables.IS_APP_CLOSED, false);
    prefs = null;
}
// end loadInfoFromLocalStorage()


private void askServer() {
    //TODO: request server than when result gotten:
    stopSelf();
}
}

и вот мой манифест:

<service
        android:name=".Services.MakeOfflineService"
        android:stopWithTask="false"/>
person Mohammad Hadi    schedule 14.09.2017