Моя цель – загрузить некоторую информацию с веб-сервера PHP. Я создал службу, чтобы работать 24 часа. Приложение запускает эту службу, используя класс менеджера alaram.
Intent ishintent = new Intent(this, AlarmReceiver.class); PendingIntent pintent = PendingIntent.getBroadcast(this, 2523, ishintent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 15000, pintent);
AlarmReceiver.class
public class AlarmReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { SharedPreferences settings = context.getSharedPreferences("local", 0); boolean TaskEnabled = settings.getBoolean("taskenabled", false); if (!TaskEnabled) { Intent myService = new Intent(context, ServiceClass.class); context.startService(myService); } } }
В классе сервиса есть AsyncTask, который загружает данные из Интернета с помощью HttpURLConnection.
@Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); new DownloadInfo().execute("http://example.com/xxx.php"); }
Класс DownloadInfo
class DownloadInfo extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... url) { // constants try { System.setProperty("http.keepAlive", "false"); HttpURLConnection connection = (HttpURLConnection) new URL(url[0]).openConnection(); connection.setDoOutput(true); connection.setConnectTimeout(30000); // miliseconds connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + "UTF-8"); Uri.Builder builder = new Uri.Builder() .appendQueryParameter("user", "1111") .appendQueryParameter("pass", "1111"); String query = builder.build().getEncodedQuery(); OutputStream os = connection.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(query); writer.flush(); writer.close(); os.close(); InputStream is = connection.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(is)); StringBuffer response = new StringBuffer(); String line = ""; while((line = rd.readLine()) != null) { response.append(line); response.append('\r'); } rd.close(); line = response.toString(); return line; } catch (Exception e) { Log.w("MyApp", "Download Exception : " + e.toString()); } return null; } @Override protected void onPostExecute(String result) { if (result != null) { } }
Я наблюдаю эту услугу за последние 53 часа. Служба работает нормально (Settings> app> Running). Я пробовал разные вещи, чтобы обеспечить 24-часовое подключение приложения, которое включает в себя включение и выключение Wi-Fi-радио, включение и выключение Wi-Fi-маршрутизатора, подключение интернет-кабеля от маршрутизатора и последующее его повторное включение. Приложение работает нормально. Но через 28 часов, когда я проверил свое приложение, я обнаружил, что приложение не загружает данные из Интернета. Похоже, что приложение пыталось подключиться к интернету, но после этого ничего не загрузило. Я проверил веб-страницу, к которой приложение пыталось получить доступ через веб-браузер устройства Android, и работает нормально. Я отключил радио Wi-Fi, и приложение сразу подключилось к интернету. Теперь, что я могу сделать, чтобы мое приложение поддерживало соединение с веб-сервером?
Обновить
AsyncTask загружает некоторую информацию, которая составляет не более 160 байт в виде текста. У нас есть птицеводческий бизнес, поэтому эта информация содержит новые тарифы на местную территорию.
Приложение запускает эту службу через регулярные промежутки времени (15 секунд) с помощью задания планирования с использованием класса AlaramManager.