Android 在onDestroy方法中更新服务器上的状态
当用户直接关闭应用程序时,我想更新用户的状态 我试过这个,但不起作用:Android 在onDestroy方法中更新服务器上的状态,android,Android,当用户直接关闭应用程序时,我想更新用户的状态 我试过这个,但不起作用: public class ExitService extends IntentService { private static String TAG = ExitService.class.getSimpleName(); public ExitService() { super(TAG); } @Override protected void onHandleIntent(Intent intent) {
public class ExitService extends IntentService {
private static String TAG = ExitService.class.getSimpleName();
public ExitService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
String callNo = intent.getStringExtra("callNo");
String status = intent.getStringExtra("status");
updateExitStatus(callNo, status);
}
}
public void updateExitStatus(final String callNo,final String status){
StringRequest strReq1= new StringRequest(Request.Method.POST,
Config.UTL_STATUS, new Response.Listener<String>(){
public void onResponse(String response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("callNo", callNo);
params.put("status",status);
Log.e(TAG, "Posting params: " + params.toString());
return params;
}
};
// Adding request to request queue
MyApplication.getInstance().addToRequestQueue(strReq1);
}
公共类ExitService扩展了IntentService{
私有静态字符串标记=ExitService.class.getSimpleName();
公共出口服务{
超级(标签);
}
@凌驾
受保护的手部内容无效(意图){
if(intent!=null){
String callNo=intent.getStringExtra(“callNo”);
字符串状态=intent.getStringExtra(“状态”);
updateExitStatus(callNo,status);
}
}
public void updateExitStatus(最终字符串callNo,最终字符串状态){
StringRequest strReq1=新的StringRequest(Request.Method.POST,
Config.UTL_状态,新的Response.Listener(){
公共void onResponse(字符串响应){
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.e(标记“Error:+Error.getMessage());
Toast.makeText(getApplicationContext(),
错误.getMessage(),Toast.LENGTH_SHORT).show();
}
}) {
@凌驾
受保护的映射getParams(){
Map params=新的HashMap();
参数put(“callNo”,callNo);
参数put(“状态”,状态);
Log.e(标记“Posting params:+params.toString());
返回参数;
}
};
//将请求添加到请求队列
MyApplication.getInstance().addToRequestQueue(streQ1);
}
}
我有一个onResume,它会将状态更新为“1”(1表示在线,0表示离线)
该应用程序也应该在后台工作,因此,从这个等式中排除了onStop和onPause。在Intent服务中调用服务器,并在super.onDestory()之前从Onestroy调用该服务 对于意向服务,请使用此链接:
试试这个它对我很有用
public class App_killed extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("ClearFromRecentService", "Service Started");
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("ClearFromRecentService", "Service Destroyed");
}
public void onTaskRemoved(Intent rootIntent) {
Log.e("ClearFromRecentService", "END");
//Code here call your network call using volley/Asynch task..
App_close();
Toast.makeText(getApplicationContext(), "Warning: App killed", Toast.LENGTH_LONG).show();
//stopSelf();
}
private void App_close() {
// Tag used to cancel the request
String tag_string_req = "close_app";
StringRequest strReq = new StringRequest(Request.Method.POST,
AppConfig.URL_CLOSE_APP, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("close App", "Killed Response: " + response.toString());
} catch (Exception e) {
// JSON error
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("close app", "Killed Error: " + error.getMessage());
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("status", status);
params.put("mobile", callNo);
return params;
}
};
// Adding request to request queue
VollyGlobal.getInstance().addToRequestQueue(strReq, tag_string_req);
}
}
现在在你的截击课上:
public class VollyGlobal extends Application {
private static Context context;
public static final String TAG = VollyGlobal.class.getSimpleName();
private RequestQueue mRequestQueue;
private static VollyGlobal mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
VollyGlobal.context = getApplicationContext();
}
public static Context getAppContext() {
return VollyGlobal.context;
}
public static synchronized VollyGlobal getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
private Request<?> setDefaultRetryPolicy(Request<?> request) {
request.setRetryPolicy(new DefaultRetryPolicy(0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
return request;
}
}
public类VollyGlobal扩展应用程序{
私有静态语境;
公共静态最终字符串标记=VollyGlobal.class.getSimpleName();
私有请求队列mRequestQueue;
私有静态自动全局最小值;
@凌驾
public void onCreate(){
super.onCreate();
mInstance=这个;
VollyGlobal.context=getApplicationContext();
}
公共静态上下文getAppContext(){
返回VollyGlobal.context;
}
公共静态同步VollyGlobal getInstance(){
回报率;
}
公共请求队列getRequestQueue(){
if(mRequestQueue==null){
mRequestQueue=Volley.newRequestQueue(getApplicationContext());
}
返回mrequest队列;
}
公共无效addToRequestQueue(请求请求,字符串标记){
请求setTag(TextUtils.isEmpty(tag)?tag:tag;
getRequestQueue().add(请求);
}
公共无效addToRequestQueue(请求请求){
要求设置标签(标签);
getRequestQueue().add(请求);
}
公共作废取消挂起请求(对象标记){
if(mRequestQueue!=null){
mRequestQueue.cancelAll(标记);
}
}
私有请求setDefaultRetryPolicy(请求){
request.setRetryPolicy(新的DefaultRetryPolicy(0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
返回请求;
}
}
什么是“不工作”?onDestroy方法没有调用?事实上,当用户关闭你的应用程序时,你无法确保onDestroy被调用。顺便说一句,你似乎在主线程中执行网络请求,这是个坏主意。只需使用一个新线程或类似AsyncTask的东西来执行网络请求。@SamMao我正在使用的api正在数据库中保存状态,所以如果我直接关闭我的应用程序,那么状态根本不会改变。这就是我如何确保destroy方法中的代码不会改变的原因worked@SamMao截击法怎么样?我不知道volley是否同步执行网络请求,只需自己检查并确保网络任务在新线程中完成。并确保在用户关闭你的应用时调用你的更新状态代码。我已经测试过,如果用户在最近的应用中刷走你的应用,你的onDestroy甚至onStop方法可能不会被调用。有关如何实现intentService的更多信息,关于这一点,你可以参考提供的链接。我会试试这个我以前已经使用过这种类型的服务,但我会尝试一下,看看它是否有效Sahil Munjal我想我不需要第4-7步,因为我只是发送和更新服务器上的状态,我正在跳过广播接收器方法,可以吗?可以,只需实现服务并在清单中定义它,然后从onDestroy调用它。在清单中,我必须这样做?查看我的代码我已经在这样做了,但是您已经做了一些更改请查看我的代码我正在调用该活动的onDestroy中的意图假设状态代替otp它是public void onDestroy(){flag=false;pulstator.stop();callNo=userNo.getText().toString();status=“0”;Intent msgIntent=new Intent(this,ExitService.class);msgIntent.putExtra(“callNo”,callNo);msgIntent.putExtra(“status”,status);startService(msgIntent);super.onDestroy();}是否有任何信息表明应用程序已关闭……整个应用程序不是活动?
<service
android:name=".App_killed"
android:stopWithTask="false" />
startService(new Intent(getBaseContext(), App_killed.class));
public class VollyGlobal extends Application {
private static Context context;
public static final String TAG = VollyGlobal.class.getSimpleName();
private RequestQueue mRequestQueue;
private static VollyGlobal mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
VollyGlobal.context = getApplicationContext();
}
public static Context getAppContext() {
return VollyGlobal.context;
}
public static synchronized VollyGlobal getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
private Request<?> setDefaultRetryPolicy(Request<?> request) {
request.setRetryPolicy(new DefaultRetryPolicy(0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
return request;
}
}