Как автоматически обновлять постоянно действующее приложение для Android без взаимодействия с пользователем

У нас есть приложение в Google Play Store, которое работает на переднем плане непрерывно. Устройства, на которых он работает, находятся вне нашего контроля и не внедрены. Они работают на Android 4.2 или 4.4.

Наша цель – обновить приложение до новейшей версии, которую мы выпускаем через Play Store без взаимодействия с пользователем. Перезапуск устройства будет единственным приемлемым вариантом «взаимодействия».

Мы обнаруживаем, что запущенное приложение не обновляется автоматически, когда оно выполняется, даже если включено «автоматическое обновление».

Каков способ достижения нашей цели?

Используйте диспетчер аварийных сообщений для запланированного обновления, а затем используйте класс создания и расширение службы или класса IntentService. Проверьте, есть ли подключение к Интернету, если да, чтобы продолжить обновление следующим образом: Проверьте эту ссылку. Службы Android – Учебник. Таким образом вы можете обновить, даже не показывая свою активность, используя сервис.

Создание диспетчера аварийных сигналов:

Calendar cal = Calendar.getInstance(); Intent intent = new Intent(this, MyService.class); PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0); AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); // Start every 30 seconds alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

Для обслуживания:

  public class DownloadService extends IntentService { private int result = Activity.RESULT_CANCELED; public static final String URL = "urlpath"; public static final String FILENAME = "filename"; public static final String FILEPATH = "filepath"; public static final String RESULT = "result"; public static final String NOTIFICATION = "com.vogella.android.service.receiver"; public DownloadService() { super("DownloadService"); } // will be called asynchronously by Android @Override protected void onHandleIntent(Intent intent) { String urlPath = intent.getStringExtra(URL); String fileName = intent.getStringExtra(FILENAME); File output = new File(Environment.getExternalStorageDirectory(), fileName); if (output.exists()) { output.delete(); } InputStream stream = null; FileOutputStream fos = null; try { URL url = new URL(urlPath); stream = url.openConnection().getInputStream(); InputStreamReader reader = new InputStreamReader(stream); fos = new FileOutputStream(output.getPath()); int next = -1; while ((next = reader.read()) != -1) { fos.write(next); } // successfully finished result = Activity.RESULT_OK; } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } publishResults(output.getAbsolutePath(), result); } private void publishResults(String outputPath, int result) { Intent intent = new Intent(NOTIFICATION); intent.putExtra(FILEPATH, outputPath); intent.putExtra(RESULT, result); sendBroadcast(intent); } } Сервис  public class DownloadService extends IntentService { private int result = Activity.RESULT_CANCELED; public static final String URL = "urlpath"; public static final String FILENAME = "filename"; public static final String FILEPATH = "filepath"; public static final String RESULT = "result"; public static final String NOTIFICATION = "com.vogella.android.service.receiver"; public DownloadService() { super("DownloadService"); } // will be called asynchronously by Android @Override protected void onHandleIntent(Intent intent) { String urlPath = intent.getStringExtra(URL); String fileName = intent.getStringExtra(FILENAME); File output = new File(Environment.getExternalStorageDirectory(), fileName); if (output.exists()) { output.delete(); } InputStream stream = null; FileOutputStream fos = null; try { URL url = new URL(urlPath); stream = url.openConnection().getInputStream(); InputStreamReader reader = new InputStreamReader(stream); fos = new FileOutputStream(output.getPath()); int next = -1; while ((next = reader.read()) != -1) { fos.write(next); } // successfully finished result = Activity.RESULT_OK; } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } publishResults(output.getAbsolutePath(), result); } private void publishResults(String outputPath, int result) { Intent intent = new Intent(NOTIFICATION); intent.putExtra(FILEPATH, outputPath); intent.putExtra(RESULT, result); sendBroadcast(intent); } }