Лучший способ загрузить файл в android с помощью?

У меня есть активность загрузки, которая загружает некоторые ZIP файлы для моего приложения. Я хочу, чтобы мои действия имели следующие возможности:

  • возможность приостановки/возобновления загрузки
  • показывает прогресс загрузки в моем пользовательском интерфейсе активности по индикатору выполнения (не с dialogProgress)
  • показывает уведомление о загрузке и когда пользователь нажимает на уведомление открывает мою активность, даже когда приложение закрыто, и мой пользовательский интерфейс обновляется во время загрузки.

Я много искал и видел множество методов, которые можно использовать для загрузки файлов (например, с помощью AsyncTask/Downloadmanager/Groundy...), но я не знаю, какая из них имеет функции, которые я хочу

Как вы думаете, лучший способ достичь этой функции вместе?

Мне не нужен полный код от вас, а также несколько советов и методов или ссылок, которые помогут мне реализовать каждую из этих функций и найти лучший способ.

Спасибо за ваше время.

Ответ 1

В принципе вы можете использовать AsyncTask, с помощью которого вы могли бы достичь вышеуказанного, если загрузка строго привязана к активности. Однако AsyncTask необходимо должным образом отменить, как только пользователь отменит или отменит действие. Также он обеспечивает базовый механизм для достижения прогресса.

Например, представьте себе простую задачу async (не лучшая реализация), но что-то вроде ниже

class SearchAsyncTask extends AsyncTask<String, Void, Void> {

        SearchHttpClient searchHttpClient = null;

        public SearchAsyncTask(SearchHttpClient client) {
            searchHttpClient = client;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // You can update the progress on dialog here
            super.onProgressUpdate(values);
        }

        @Override
        protected void onCancelled() {
            // Cancel the http downloading here
            super.onCancelled();
        }

        protected Void doInBackground(String... params) {

            try {

                // Perform http operation here  
                // publish progress using method publishProgress(values)
                return null;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute() {
                 // If not cancelled then do UI work

        }
    }

Теперь в вашей деятельности onDestroy метод

@Override
protected void onDestroy() {
    Log.d(TAG, "ResultListActivity onDestory called");
    if (mSearchTask != null && mSearchTask.getStatus() != AsyncTask.Status.FINISHED) {
    // This would not cancel downloading from httpClient 
    //  we have do handle that manually in onCancelled event inside AsyncTask
        mSearchTask.cancel(true); 
        mSearchTask = null;
    }
    super.onDestroy();
}

Однако, если вы разрешаете пользователю загружать файл даже независимо от активности (например, он продолжает загружаться, даже если пользователь ушел из Activity), я бы предложил использовать Сервис, который может делать материал в фоновом режиме.

UPDATE: просто заметил, что есть аналогичный ответ на Stackoverflow, который более подробно объясняет мои мысли Загружает файл с Android и показывает прогресс в ProgressDialog