如何在android服务中下载文件

问题描述 投票:0回答:1

我想从server

下载
文件,我想在后台下载这个文件,比如服务。

我的代码是:

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
并在background.

中下载文件

我如何在服务中编写这些代码?

android android-service android-download-manager
1个回答
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
以在它们之间传递回调并 bind 具有活动生命周期的服务。查看此 link 了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.