'How can download file in service in android
I want download file from server and i want download this in background such as service.
My codes is :
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);
}
}
i write above codes but i don't know how can i write this code into service and download file in background.
How can i write this codes in service?
Solution 1:[1]
A service can be started using context.startService(intent) .
Once the service is started, it's lifecycle is executed as below (in sequence):
onCreate()onStartCommand()
When the service is stopped or destroyed, it's onDestroy() method is called.
Now to download the file in service, call the startService() method as below (From your activity in this case):
Intent intent = new Intent(MainActivity.this, ServiceName.class);
startService(intent);
This will start the service. Now to start the download process, call your downloadFile() method as show below:
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.
.
.
.
}
}
Also you can bind the service to the activity to pass callbacks between them and bind the service w/ activity's lifecycle. Checkout this link for more info on this.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Vaibhav Singhal |
