come posso mantenere il file di download in esecuzione (download) se l'app viene distrutta con il servizio? sto scaricando video usando questo collegamento e il download del file in background, ma il problema è che l'applicazione distrugge il download annullato
ora voglio sapere come posso continuare a eseguire il download del file se l'app viene distrutta
codice di servizio
public class DownloadService extends Service {
private ThinDownloadManager downloadManager;
private static final int DOWNLOAD_THREAD_POOL_SIZE = 4;
RetryPolicy retryPolicy;
public List<Integer> downloadIds;
@Override
public void onCreate() {
super.onCreate();
downloadManager = new ThinDownloadManager(DOWNLOAD_THREAD_POOL_SIZE);
retryPolicy = new DefaultRetryPolicy(5000, 3, 2f);
downloadIds = new ArrayList<>();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
Uri downloadUri = Uri.parse(intent.getStringExtra("url"));
Uri filepath = Uri.parse(intent.getStringExtra("filepath"));
Log.e("url", downloadUri.toString());
Log.e("filepath", filepath.toString());
startDownload(downloadUri, filepath);
} else {
Toast.makeText(this, "intent is null", Toast.LENGTH_SHORT).show();
}
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void startDownload(final Uri downloadUri, final Uri destinationUri) {
try {
int downloadId1 = (int) System.currentTimeMillis();
final DownloadRequest downloadRequest = new DownloadRequest(downloadUri)
.setRetryPolicy(retryPolicy)
.setDestinationURI(destinationUri).setPriority(DownloadRequest.Priority.HIGH)
.setDownloadContext("Download")
.setStatusListener(new DownloadStatusListenerV1() {
@Override
public void onDownloadComplete(DownloadRequest downloadRequest) {
if (downloadIds != null && downloadIds.size() > 0) {
Log.e("complete", downloadRequest.toString());
Log.e("path", destinationUri + "");
}
}
@Override
public void onDownloadFailed(DownloadRequest downloadRequest, int errorCode, String errorMessage) {
if (downloadIds != null && downloadIds.size() > 0) {
Log.e("fail", downloadRequest.toString() + " " + errorMessage);
}
}
@Override
public void onProgress(DownloadRequest downloadRequest, long totalBytes, long downloadedBytes, int progress) {
if (downloadIds != null && downloadIds.size() > 0) {
Log.e("progress", progress + " ");
}
}
});
if (downloadManager.query(downloadId1) == DownloadManager.STATUS_NOT_FOUND) {
downloadId1 = downloadManager.add(downloadRequest);
downloadIds.add(downloadId1);
}
} catch (Exception e) {
Log.e("catch", e.toString());
}
}
}
classe di attività
Intent intent = new Intent(VideolIst.this, DownloadService.class);
intent.putExtra("url", downloadUri.toString());
intent.putExtra("filepath", destinationUri.toString());
this.startService(intent);
definito anche in manifest come
<service android:enabled="true" android:name="DownloadService" >
risposte:
0 per risposta № 1Prova tornando START_REDELIVER_INTENT
, quindi il servizio verrà programmato per un riavvio e l'ultimo Intent consegnato viene riconsegnato tramite onStartCommand.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
Uri downloadUri = Uri.parse(intent.getStringExtra("url"));
Uri filepath = Uri.parse(intent.getStringExtra("filepath"));
Log.e("url", downloadUri.toString());
Log.e("filepath", filepath.toString());
startDownload(downloadUri, filepath);
} else {
Toast.makeText(this, "intent is null", Toast.LENGTH_SHORT).show();
}
return START_REDELIVER_INTENT; // change this
}
Per ulteriori informazioni sui tipi di restituzione del servizio, leggi: https://developer.android.com/reference/android/app/Service.html
0 per risposta № 2
Vedi sotto il link per processi e attributo per il servizio in AndroidManifest.xml
https://developer.android.com/guide/topics/manifest/service-element.html
Nel file manifest:
<service
android:name="com.xyz.XyzService"
android:enabled="true"
android:exported="true"
android:process=":remote">
</service>
Per definire il tuo servizio con android: process = ": remote" . fondamentalmente esegui il tuo servizio in un processo diverso (= VM).
Spero che ti possa aiutare!