Android-запрос к серверу перед принудительным закрытием приложения
У меня есть только одно действие, когда пользователь закрывает приложение (из понятного списка последних приложений), я хочу отправить запрос на мой сервер 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"/>
2 ответа
Вы пытались вернуться START_STICKY
в onStartCommand
переопределить?
После того как вы отправили запрос, вы можете позвонить stopService
чтобы остановить себя.
Насколько я знаю, даже липкие сервисы могут быть "воссозданы", когда вы убиваете приложение. Так что, возможно, Намерение не лучший способ использовать здесь.
Я бы пошел с SharedPreferences
Вот:
onCreate
вашего приложения устанавливает ключ "app_offline" в "false"onDestroy
устанавливает этот ключ в "true" и запускает службуСлужба
START_STICKY
и когда он находит app_offline как true, отправляет запрос, обновляет app_offline до false (сбрасывает его), а затем выполняет самоотключение.
Что-то вроде того. Надеюсь, что это помогает, ура, Гри
Спасибо за ответ 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"/>