Android背景下载仅限WiFi

时间:2016-09-10 06:26:58

标签: android service android-download-manager

如果有Wi-Fi,我的应用程序需要在晚上下载文件。 Service是实施它的最佳方式吗?

如果用户关闭我的应用,这是否意味着我无法以任何方式下载?这意味着我的用户必须将我的应用程序保留在后台?

3 个答案:

答案 0 :(得分:0)

如果您运行粘性服务,即使您的应用程序已关闭,您也可以在工作线程中下载文件而非主线程。因此,完成后您可以使用广播接收器通知用户或开始活动。

答案 1 :(得分:0)

您可以使用DownloadManager并将允许的网络类型限制为仅限Wi-Fi。

例如:

DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Uri uri = Uri.parse("http://something.xyz/somefile.asd");

DownloadManager.Request request = new DownloadManager.Request(uri);
// allowing Wi-Fi only
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);

long id = manager.enqueue(request);

要在下载完成时收到通知,您可以为ACTION_DOWNLOAD_COMPLETE广播定义接收方:

private final BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // the ID of the finished download
        long downloadedId = intent.getLongExtra(
            DownloadManager.EXTRA_DOWNLOAD_ID, -1);

        // do whatever you'd like here
    }
};

注册/取消注册:

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(downloadReceiver,
        new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}

@Override
protected void onPause() {
    unregisterReceiver(downloadReceiver);
    super.onPause();
}

不要忘记为 Manifest 添加适当的权限:

<!-- required -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- optional -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 2 :(得分:0)

即使您的应用已关闭,您也可以使用服务。我建议使用IntentService。它易于使用,并且在UI线程以外的线程中运行。您也可以将其设置为STICKY,以便即使Android杀死它也会重新启动您的服务。