如果有Wi-Fi,我的应用程序需要在晚上下载文件。 Service
是实施它的最佳方式吗?
如果用户关闭我的应用,这是否意味着我无法以任何方式下载?这意味着我的用户必须将我的应用程序保留在后台?
答案 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杀死它也会重新启动您的服务。