Android 在应用程序完全关闭之前向服务器请求
Android Request to server before application compeletly closed
我只有一个 Activity ,当用户 close 应用程序(来自 os 最近应用程序的清除列表)时,我想向我的服务器发送请求 api 并更改用户状态。
所以我制作了 IntentService 并在我的 activity 的 onDestroy() 方法中调用它,但它 os 不起作用。怎么办?还有其他方法可以做到这一点(在应用程序被完全杀死之前向服务器发送请求)吗?
我的代码:
Activity:
@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"/>
您是否尝试过 return START_STICKY
在 onStartCommand
覆盖中?
发送请求后,您可以致电 stopService
停止。
据我所知,当您终止应用程序时,即使是粘性服务也可能 "recreated"。所以也许,Intent 并不是在这里使用的最佳方式。
我会在这里选择 SharedPreferences
:
您应用的 onCreate
将密钥 "app_offline" 设置为 "false"
onDestroy
设置此键为"true"并启动服务
服务是 START_STICKY
,当它发现 "app_offline" 为真时,发送它的请求,更新 "app_offline" 为假(重置它)然后执行自关机。
类似的东西。
希望这有帮助,干杯,格里斯
感谢 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);
}
在这个 activity 的 onDestroy 中:
@Override
protected void onDestroy() {
saveL.saveInLocalStorage(Variables.IS_APP_CLOSED,true);
super.onDestroy();
}
这是我的服务 class :
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"/>
我只有一个 Activity ,当用户 close 应用程序(来自 os 最近应用程序的清除列表)时,我想向我的服务器发送请求 api 并更改用户状态。 所以我制作了 IntentService 并在我的 activity 的 onDestroy() 方法中调用它,但它 os 不起作用。怎么办?还有其他方法可以做到这一点(在应用程序被完全杀死之前向服务器发送请求)吗? 我的代码:
Activity:
@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"/>
您是否尝试过 return START_STICKY
在 onStartCommand
覆盖中?
发送请求后,您可以致电 stopService
停止。
据我所知,当您终止应用程序时,即使是粘性服务也可能 "recreated"。所以也许,Intent 并不是在这里使用的最佳方式。
我会在这里选择 SharedPreferences
:
您应用的
onCreate
将密钥 "app_offline" 设置为 "false"onDestroy
设置此键为"true"并启动服务服务是
START_STICKY
,当它发现 "app_offline" 为真时,发送它的请求,更新 "app_offline" 为假(重置它)然后执行自关机。
类似的东西。 希望这有帮助,干杯,格里斯
感谢 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);
}
在这个 activity 的 onDestroy 中:
@Override
protected void onDestroy() {
saveL.saveInLocalStorage(Variables.IS_APP_CLOSED,true);
super.onDestroy();
}
这是我的服务 class :
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"/>