2016-11-06 4 views
0

Я хочу загрузить файл от server и я хочу загрузить это в фоновом режиме, таком как сервис.Как скачать файл в службе в android

Моих код являются:

public class MainActivity extends AppCompatActivity { 

    Button download; 
    TextView downloadCount; 
    ProgressBar progressBar; 

    Future<File> downloading; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Enable global Ion logging 
     Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG); 

     setContentView(R.layout.activity_main); 

     download = (Button) findViewById(R.id.download); 
     downloadCount = (TextView) findViewById(R.id.download_count); 
     progressBar = (ProgressBar) findViewById(R.id.progress); 

     File sdCard = Environment.getExternalStorageDirectory(); 
     File dir = new File(sdCard.getAbsolutePath() + "/dir1/dir2"); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 
     final File file = new File(dir, "filename.zip"); 

     download.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (downloading != null && !downloading.isCancelled()) { 
        resetDownload(); 
        return; 
       } 

       download.setText("Cancel"); 
       // this is a 180MB zip file to test with 
       downloading = Ion.with(MainActivity.this) 
         .load("http://cdn.p30download.com/?b=p30dl-software&f=PCWinSoft.1AVMonitor.v1.9.1.50_p30download.com.rar") 
         // attach the percentage report to a progress bar. 
         // can also attach to a ProgressDialog with progressDialog. 
         .progressBar(progressBar) 
         // callbacks on progress can happen on the UI thread 
         // via progressHandler. This is useful if you need to update a TextView. 
         // Updates to TextViews MUST happen on the UI thread. 
         .progressHandler(new ProgressCallback() { 
          @Override 
          public void onProgress(long downloaded, long total) { 
           downloadCount.setText("" + downloaded + "/" + total); 
          } 
         }) 
         // write to a file 
         .write(file) 
         // run a callback on completion 
         .setCallback(new FutureCallback<File>() { 
          @Override 
          public void onCompleted(Exception e, File result) { 
           resetDownload(); 
           if (e != null) { 
            Toast.makeText(MainActivity.this, "Error downloading file", Toast.LENGTH_LONG).show(); 
            return; 
           } 
           Toast.makeText(MainActivity.this, "File upload complete", Toast.LENGTH_LONG).show(); 
          } 
         }); 
      } 
     }); 
    } 

    void resetDownload() { 
     // cancel any pending download 
     downloading.cancel(); 
     downloading = null; 

     // reset the ui 
     download.setText("Download"); 
     downloadCount.setText(null); 
     progressBar.setProgress(0); 
    } 
} 

я пишу выше коды, но я не знаю, как я могу написать этот код в service и скачать файл в фоне.

Как я могу писать эти коды в эксплуатации?

ответ

0

Услуга может быть запущена с использованием context.startService(intent). После запуска службы, это жизненный цикл выполняется, как показано ниже (в последовательности):

  1. onCreate()
  2. onStartCommand()

Когда служба остановлена ​​или уничтожены, это onDestroy() метод вызывается.

Теперь, чтобы загрузить файл в службе, вызовите метод startService(), как показано ниже (от вашей деятельности в данном случае):

Intent intent = new Intent(MainActivity.this, ServiceName.class); 
startService(intent); 

Это запустит службу. Теперь, чтобы начать процесс загрузки, вызовите метод downloadFile(), как показано ниже:

public class ServiceName extends Service { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     //Start download process 
     downloadFile(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // We want this service to continue running until it is explicitly 
     // stopped, so return 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    private void downloadFile() { 
     //Logic to download the file. 
     . 
     . 
     . 
    } 
} 

Также вы можете связать service к activity пройти обратные вызовы между ними и связывают Службы жизненного цикла ш/Деятельность в. Оформить заказ link для получения дополнительной информации.

+0

Кроме того, в качестве примечания помните, что вам необходимо учитывать многопоточность служб, а не Intent-Service, которая позаботится об этом для вас. Тем не менее, вы намерены ставить в очередь, если используете Intent-Service, потому что они выполняются один за другим. Просто посмотрите, что сработает для вас. –

Смежные вопросы