0

如果网络不可用,我的 android 应用程序会在 5 到 10 分钟内在后台被杀死。

App在后台不断调用一些rest服务。

我的 logcat 没有任何异常。

但是当我回到前台时,我的应用程序从头开始,因为它被操作系统杀死了。

请建议我可能是什么原因以及我应该怎么做才能防止它。

public void sendHttpPost() throws ClientProtocolException, IOException{
        HttpPost httpPostRequest = new HttpPost(url + buildParams());

        // add headers
        HttpParams httpParams = new BasicHttpParams();
        Iterator it = headers.entrySet().iterator();
        Iterator itP = params.entrySet().iterator();
        while (it.hasNext()) {
            Entry header = (Entry) it.next();
            httpPostRequest.addHeader((String)header.getKey(), (String)header.getValue());
        }
        while(itP.hasNext())
        {
            Entry header = (Entry) itP.next();
            StringEntity se = new StringEntity((String) header.getValue());
            httpPostRequest.setEntity(se);
        }
        HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
        HttpConnectionParams.setSoTimeout(httpParams, 30000);
        httpPostRequest.setParams(httpParams);
        HttpClient client = new DefaultHttpClient();
        HttpResponse resp;

        resp = client.execute(httpPostRequest);

        this.respCode = resp.getStatusLine().getStatusCode();
    //  Log.i(TAG, "response code: " + getResponseCode());
        this.responsePhrase = resp.getStatusLine().getReasonPhrase();
    //  Log.i(TAG, "error msg: " + getErrorMsg());
        HttpEntity entity = resp.getEntity();

        if (entity != null){
            InputStream is = entity.getContent();
            //Header contentEncoding = resp.getFirstHeader("Content-encoding");
            //Log.i(TAG, "endoding" + contentEncoding.getValue());
            response = convertStreamToString(is);
            //response = response.substring(1,response.length()-1);
            //response = "{" + response + "}";
    //      Log.i(TAG, "response: " + response);
            screen.update("Login", response, false);
            is.close();
        }
    }

这是即使网络不可用也与服务器交互的方法

下面是线程调用休息服务的代码。

如何对服务做同样的事情:

public void start()
    {
        try{

            if(_exit)
                return;      
            //_lastExecute = System.currentTimeMillis();
            _try++;
        //  Log.i("-----HK Requests--------- \n\r", _url);
            final String response = HttpConnector.callWebService(_url, _data, _listener, _token);

            CallBackThread ct = new CallBackThread(_action, response, autocallreq);
            ct.start();         
//          while(ct.isAlive())
//          {
//              Thread.sleep(500);  
//          }
        }        

        catch(Exception e)
        {
            System.out.print("error="+e.getMessage());
            Helper.LogException(this, e);
            //CallBackThread ct = new CallBackThread(_action, "", autocallreq);
            //ct.start();
        }
    }

谢谢

4

1 回答 1

1

如果网络不可用,我的 android 应用程序会在 5 到 10 分钟内在后台被杀死

当您的应用程序没有任何前台Activity或前台Service实例时,这就是假设发生的情况。这还取决于您的应用程序在后台消耗了多少内存 - 如果消耗大量内存,操作系统会将您的应用程序置于高优先级以首先被“杀死”。

此 Google IO 视频详细说明了在这种情况下您的应用程序何时可能被终止 - http://www.youtube.com/watch?v=gbQb1PVjfqM&list=PL4C6BCDE45E05F49E&index=10&feature=plpp_video

在视频中间讨论这个问题是两三分钟

App在后台不断调用一些rest服务

如果你没有从 androidService类调用 REST 方法 - 你应该这样做,因为正如我所说 - 如果没有 Activity 是前台或没有前台服务正在运行,操作系统将非常快地终止你的进程,

我必须说,在后台运行长时间网络操作的后台服务无论如何都是一个坏主意:它会消耗大量电池,而且还会消耗 3G 带宽。用户意识到你的应用会耗尽电池后,他们会很快删除你的应用。所以你应该小心不要在后台做太多事情

于 2013-02-01T12:00:10.610 回答