/ / come posso mantenere il file di download in esecuzione (download) se l'app viene distrutta con il servizio? - Android, servizio, servizio Android

come posso mantenere il file di download in esecuzione (download) se l'app viene distrutta con il servizio? - Android, servizio, servizio Android

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 № 1

Prova 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!