在App卸载期间,如何取消下载?

时间:2014-11-24 10:20:22

标签: android android-service background-process android-download-manager

在我的应用程序中,我已经开始下载服务,它在后台工作正常。在下载我的测试团队做强制停止和清除数据或卸载。但卸载或清除数据后仍然我的下载服务在后台运行。下载期间我已经安装了相同的应用程序,但它是行为不端的东西。卸载或清除数据或强制停止我必须取消下载如何?

public class FileDownloaderService extends IntentService {


    private CarcarePreferences preferences;

    public FileDownloaderService() {
        super("FileDownloaderService");
    }

    @Override
    public void onCreate() {
        super.onCreate();

        preferences = CarcarePreferences.getCarcarePreferencesObject(getApplicationContext());
        DBHelper.getInstance(getApplicationContext()).open();

        downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();

        if (extras == null) {
            return;
        }

        if (extras.containsKey("ResultReceiver")) {
            resultReceiver = extras.getParcelable("ResultReceiver");
        }

        if (extras.containsKey("ContentToDownload")) {
            contentToDownload = extras.getInt("ContentToDownload");
        } else {
            return;
        }

        if (contentToDownload != Carcare.ContentToDownload.IMAGES) {
            isDefaultVehicle = extras.getBoolean("IsDefaultVehicle");
            fetchVehicle();
        }

        switch (contentToDownload) {
            case Carcare.ContentToDownload.HEADUNIT_IMAGES:
                if (extras.containsKey("HeadUnits")) {
                    headUnits = (ArrayList<Unit>) extras.getSerializable("Units");
                    downloadHeadUnits();
                    resultReceiver.send(0, null);
                }
                break;


        }
    }

    private void fetchVehicle() {
        Object[] objects;

        if (isDefaultVehicle) {
            objects = DBAdapter.getAllVehicles(preferences.getDefaultModel(),
                    preferences.getDefaultYear(), isDefaultVehicle);
        } else {
            objects = DBAdapter.getAllVehicles(preferences.getCurrentModel(),
                    preferences.getCurrentYear(), isDefaultVehicle);
        }

        vehicle = (Vehicle) objects[0];
    }

    private void downloadHeadUnits() {
        mHeadUnitDir = SdUtils.getDir(this);
        //clearHeadUnits();

        for (CUnit unit : Units) {

            String fileName = mDir + "/" + unit.getGuid() + ".png";
            InputStream stream = null;
            final HttpGet httpRequest = new HttpGet(unit.getHuImageUrl());
            httpRequest.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_KEEP_ALIVE);
            try {
                File file = new File(fileName);
                if (!file.exists()) {
                    FileOutputStream out = new FileOutputStream(file); //openFileOutput(fileName);
                    stream = new DefaultHttpClient().execute(httpRequest).getEntity().getContent();
                    Bitmap bitmap = BitmapFactory.decodeStream(stream);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            } catch (IllegalStateException ex) {
                ex.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void download() {
        cancelDownload(Carcare.FileType.QRG, vehicle.getPath());
        deleteDoc(vehicle.getQRGPath());

        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(vehicle.getUrl()));
        request.setDestinationUri(Uri.parse(vehicle.getPath()));
        request.setTitle("Unit");
        request.setDescription("Quick Reference Guide");

        preferences.setDownloadID(Carcare.FileType.QRG, downloadManager.enqueue(request));
    }
}

2 个答案:

答案 0 :(得分:0)

查看DownloadManager的remove()方法。

它说:

  

public int remove(long ... ids)在API级别9中添加

     

取消下载并从下载管理器中删除它们。每   如果它正在运行,它将停止下载,它将不再存在   可通过下载管理器访问。如果有下载   文件,部分或完整,它被删除。参数ids的ID   下载以删除退货

the number of downloads actually removed

修改

要拦截您的应用程序卸载,请查看此answer

答案 1 :(得分:0)

您必须使用Service

在服务onDestroy()中,您可以编写代码以完成DownloadManager

在应用程序即将卸载之前,Service将被终止。 这样下载就会停止。