pushthebutton
@pushthebutton

BroadcastReceiver + IntentService, как отправить http-запрос в режиме ожидания (сна) девайса ?

Хочу сделать приложение под адройд, которое при получении СМС отправляет http запрос на мой сервер. Собственно приложение я написал, оно даже работает, но с оговорками.
А именно - http запрос корректно отправляется только тогда, когда телефон включен и находится в активном режиме. Если СМС приходит в момент, когда телефон находится в режиме сна, то отправка запроса не происходит, хотя receiver срабатывает.
Я заметил достаточно интересное поведение - если подключить дебаг и нажать на кнопку питания девайса (перевести в режим сна), то HTTP запрос таки будет отправлен. Но, как только отключаешь шнурок - приложение перестает отправлять запросы.
Я уже перепробовал много способов - сделал сервис, который по onCreate создает новый экземляр ресивера

@Override
    public void onCreate(){
        super.onCreate();
        _SMSReceiver = new SMSReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(_SMSReceiver, filter);
        Log.e("Connect", "onStart");
    }


Потом я сделал IntentService, экземпляр которого создается при срабатывании ресивера

@Override
protected void onHandleIntent(Intent intent)
{
..............
..............
	        HttpAsyncSendOperation http = new HttpAsyncSendOperation(this, smsDTO);
	        http.execute();
}


Результат один: http запрос не отправляется, если телефон в режиме сна, зато ресивер срабатывает всегда.

Как решить проблему, может я неправильно применяю функционал сервисов android ?

PS
Отправку Http запроса я оборачиваю в asynctask;
Вот метод, вызываемый из doInBackground

Метод отправки запроса
public static String SendHTTPRequest(String URI, List<NameValuePair> params)
{
		String paramsString = URLEncodedUtils.format(params, "UTF-8");	    
	    
	    HttpParams httpParameters = new BasicHttpParams();
	    HttpConnectionParams.setConnectionTimeout(httpParameters, 8000);
	    HttpConnectionParams.setSoTimeout(httpParameters, 15000);
	    
	    HttpClient httpclient = new DefaultHttpClient(httpParameters);
	    HttpGet httpget = new HttpGet(Preferences.Host_URL + "?" + paramsString);
	    try
	    {	    		    	
	    	HttpResponse response = httpclient.execute(httpget);
	        HttpEntity entity = response.getEntity();

	        if (entity != null)
	        {
	            InputStream instream = entity.getContent();
	            String result = inputStreamToString(instream);

	            instream.close();	            
	            return result;
	        }
	        else return "";
	    }
	    catch (Exception e)
	    {
	    	return null;
	    }        
}

  • Вопрос задан
  • 2819 просмотров
Решения вопроса 1
pushthebutton
@pushthebutton Автор вопроса
Вопрос решился.
На моем андройде версии 2.3.6 сервисы действительно не могли взаимодействовать с сетью для передачи пакетных данных. При этому не важно какая именно эта сеть (GSM или WIFI).
При установке приложения на андройд 4.1 (девайс от самсунг) проблем вообще никаких - данные отправляются как в режиме ожидания, так и в рабочем режиме.
Еще протестировал на девайсе с kitkat (алкатель), результат прогнозируемый - все штатно.
Выходит проблема в версии андройда 2.3.6 или в конкретной прошивке от производителя (самсунг гелекси 1)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@carbon88
.NET developer/ORM developer
может в андройде есть какая-нибудь опция, которая запрещает сетевые взаимодействия в фоне если телефон работает от батареи, какой-нибудь режим экономии? но это чисто догадка потому как
1) активный режим и от батареи - работает
2) активный режим от шнурка(зарядка идет) - работает
3) фоновый режим и от батареи - не работает
4) фоновый режим от шнурка - работает

как вариант решения проблемы делать очередь пришедших сообщений и отправлять их в активном режиме. потому как не известно как приложение будет работать на других телефонах с другими оптимизаторами энергоэффективности.
не известно какой режим энергоэффективности запилил производитель и что там запрещается
Ответ написан
aratj
@aratj
программер.
а может просото в настройках у вас стоит, что бы передача данных вырубалась, когда тел. не используется ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы