J'essaie de mettre à jour mon application en téléchargeant l'apk en utilisant le gestionnaire de téléchargement. J'ai enregistré le récepteur de diffusion pour écouter DownloadManager.ACTION_DOWNLOAD_COMPLETE
dans MainActivity
et ouvrir l'apk dans la méthode onReceive
. Voici le code:Application de mise à jour Android à travers l'application redémarre en utilisant DownloadManager (éviter de télécharger plusieurs fois)
public class MainActivity extends CordovaActivity {
private long downloadReference;
private DownloadManager downloadManager;
private IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(downloadReceiver, intentFilter);
}
public void updateApp(String url) {
//start downloading the file using the download manager
downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri Download_Uri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
request.setAllowedOverRoaming(false);
request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_DOWNLOADS, "myapk.apk");
downloadReference = downloadManager.enqueue(request);
}
@Override
public void onDestroy() {
//unregister your receivers
this.unregisterReceiver(downloadReceiver);
super.onDestroy();
}
private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//check if the broadcast message is for our Enqueued download
long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (downloadReference == referenceId) {
//start the installation of the latest version
Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.setDataAndType(downloadManager.getUriForDownloadedFile(downloadReference),
"application/vnd.android.package-archive");
installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(installIntent);
}
}
};
}
updateApp(url)
est appelé clic d'un bouton dans l'interface utilisateur. Maintenant, après avoir cliqué sur le bouton, le téléchargement commence. Disons que l'application est fermée (le récepteur n'est pas enregistré) après avoir lancé le téléchargement, j'ai un problème avec deux scénarios lorsque l'application est relancée.
Le téléchargement précédent se termine après mon application redémarre -
downloadReference
est perdu et quand mon récepteur reçoit l'émission, lereferenceId
ne sera pas identique àdownloadReference
, doncinstallIntent
est jamais commencé. Donc Je dois encore cliquer sur le bouton Mettre à jour et lancer le téléchargement. Y at-il un moyen d'éviter ce problème?Le téléchargement précédent se termine avant le redémarrage de mon application - Il est impossible de savoir que mon dernier téléchargement est terminé en l'activité nouvellement démarrée. Encore une fois je dois cliquer sur le bouton et relancer le téléchargement. Est-il possible d'activer la diffusion pour le gestionnaire de téléchargement?