Ich versuche, meine App durch Herunterladen der apk mit Download-Manager zu aktualisieren. Ich habe Rundfunkempfänger registriert, um DownloadManager.ACTION_DOWNLOAD_COMPLETE
in MainActivity
zu hören und die apk in onReceive
Methode zu öffnen. Im Folgenden finden Sie den Code ein:Android Update-App über App neu startet mit DownloadManager (vermeiden Sie den Download mehrmals)
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)
auf einen Klick in UI aufgerufen wird. Nach dem Klick auf den Button wird der Download gestartet. Nehmen wir an, die App ist geschlossen (Empfänger ist nicht registriert), nachdem der Download gestartet wurde. Ich habe Probleme mit zwei Szenarien, wenn die App erneut gestartet wird.
Der vorherige Download abgeschlossen ist nach meiner app neu gestartet wird -
downloadReference
verloren, und wenn mein Empfänger die Sendung empfängt, wird diereferenceId
gewohnt gleiche wiedownloadReference
, so wirdinstallIntent
nie gestartet. Also Ich muss noch einmal auf Update klicken und den Download starten. Ist gibt es eine Möglichkeit, dieses Problem zu vermeiden?Der vorherige Download wird abgeschlossen, bevor meine App neu gestartet wird - Es ist nicht möglich zu wissen, dass mein vorheriger Download in der neu gestarteten Aktivität abgeschlossen ist. Wieder muss ich auf den Button klicken und den Download neu starten. Gibt es eine Möglichkeit, Sticky Broadcast für Download-Manager zu aktivieren?