Heim  >  Artikel  >  Java  >  Android-Anwendung erzwingt Update-APP

Android-Anwendung erzwingt Update-APP

高洛峰
高洛峰Original
2017-02-28 16:04:493556Durchsuche

Erzwungene Updates von Android-Anwendungen sind sehr nützlich. Insbesondere bei neu gestarteten Anwendungen treten auf jeden Fall mehr oder weniger Fehler auf. Wenn etwas schief geht, ist dies besonders wichtig wichtig.

Im Allgemeinen lautet die Strategie für erzwungene Updates:

Wenn die Anwendung startet, fordert sie den Hintergrund an und der Hintergrund sendet die neuesten Informationen Informationen zur Version der Anwendung (einschließlich Versionsnummer der Anwendung, Name, Beschreibung des Aktualisierungsinhalts, Serveradresse zum Herunterladen des Pakets, Markierung, ob eine Aktualisierung erzwungen werden soll) usw.

Jetzt schreiben wir den Implementierungscode basierend auf den oben genannten Ideen.

1. Informationen zur AndroidManifest-Konfigurationsversion

Die Versionsidentifikation jeder Android-Apk ist in AndroidManifest.xml definiert:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo"
android:versionCode="1"
android:versionName="1.0.0">
<application>
</application>
</manifest>

Darunter ist package="com.demo" unser Paketname; android:versionCode="1" ist der Versionscode, der eine Ganzzahl ist; 1.0 .0" ist der Versionsname, der eine Zeichenfolge ist und dem Benutzer angezeigt wird.

Wenn Sie die Versionsnummer und den Versionsnamen in der AndroidManifest-Datei lesen müssen, können Sie diese einfach mit packageManager abrufen. Der Code lautet wie folgt:

public static int getVerCode(Context context) {
int verCode = -1;
try {
verCode = context.getPackageManager().getPackageInfo(
"com.demo", 0).versionCode;
} catch (NameNotFoundException e) {
Log.e(TAG, e.getMessage());
}
return verCode;
}
public static String getVerName(Context context) {
String verName = "";
try {
verName = context.getPackageManager().getPackageInfo(
"com.demo", 0).versionName;
} catch (NameNotFoundException e) {
Log.e(TAG, e.getMessage());
}
return verName;
}

2. Versionsprüfung durchführen

Platzieren Sie ihn auf Der Server Die neueste Version der APK-Datei, z. B.: http://localhost/mydemo/demo.apk

Platzieren Sie gleichzeitig die Versionsinformations-Aufrufschnittstelle oder Datei, die dieser APK entspricht, auf dem Server , wie zum Beispiel: http://localhost/ mydemo/ver.json

Der Inhalt in ver.json ist:

Der Code lautet wie folgt:

[{"appname": "jtapp12", "apkname": "jtapp-12-updateapksamples.apk", "verName":1.0.1, "verCode":2}]

Lesen Sie dann die Version auf dem mobilen Client und prüfen Sie:

private boolean getServerVer () {
try {
String verjson = NetworkTool.getContent(Config.UPDATE_SERVER + Config.UPDATE_VERJSON);
JSONArray array = new JSONArray(verjson);
if (array.length() > 0) {
JSONObject obj = array.getJSONObject(0);
try {
newVerCode = Integer.parseInt(obj.getString("verCode"));
newVerName = obj.getString("verName");
} catch (Exception e) {
newVerCode = -1;
newVerName = "";
return false;
}
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
return false;
}
return true;
}

Vergleichen Sie die Server- und Clientversionen und führen Sie Aktualisierungsvorgänge durch.

if (getServerVerCode()) {
int vercode = Config.getVerCode(this); // 用到前面第一节写的方法
if (newVerCode > vercode) {
doNewVersionUpdate(); // 更新新版本
} else {
notNewVersionShow(); // 提示当前为最新版本
}
}

Aufrufmethode:

private void notNewVersionShow() {
int verCode = Config.getVerCode(this);
String verName = Config.getVerName(this);
StringBuffer sb = new StringBuffer();
sb.append("当前版本:");
sb.append(verName);
sb.append(" Code:");
sb.append(verCode);
sb.append(",\n已是最新版,无需更新!");
Dialog dialog = new AlertDialog.Builder(Update.this).setTitle("软件更新")
.setMessage(sb.toString())// 设置内容
.setPositiveButton("确定",// 设置确定按钮
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
finish();
}
}).create();// 创建
// 显示对话框
dialog.show();
}
private void doNewVersionUpdate() {
int verCode = Config.getVerCode(this);
String verName = Config.getVerName(this);
StringBuffer sb = new StringBuffer();
sb.append("当前版本:");
sb.append(verName);
sb.append(" Code:");
sb.append(verCode);
sb.append(", 发现新版本:");
sb.append(newVerName);
sb.append(" Code:");
sb.append(newVerCode);
sb.append(", 是否更新?");
Dialog dialog = new AlertDialog.Builder(Update.this)
.setTitle("软件更新")
.setMessage(sb.toString())
// 设置内容
.setPositiveButton("更新",// 设置确定按钮
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
pBar = new ProgressDialog(Update.this);
pBar.setTitle("正在下载");
pBar.setMessage("请稍候...");
pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME);
}
})
.setNegativeButton("暂不更新",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
// 点击"取消"按钮之后退出程序
finish();
}
}).create();// 创建
// 显示对话框
dialog.show();
}

Update-Download:

void downFile(final String url) {
pBar.show();
new Thread() {
public void run() {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse response;
try {
response = client.execute(get);
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
FileOutputStream fileOutputStream = null;
if (is != null) {
File file = new File(
Environment.getExternalStorageDirectory(),
Config.UPDATE_SAVENAME);
fileOutputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int ch = -1;
int count = 0;
while ((ch = is.read(buf)) != -1) {
fileOutputStream.write(buf, 0, ch);
count += ch;
if (length > 0) {
}
}
}
fileOutputStream.flush();
if (fileOutputStream != null) {
fileOutputStream.close();
}
down();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}

Der Download ist abgeschlossen und der Haupt-UI-Thread wird über den Handler benachrichtigt, das Download-Dialogfeld abzubrechen.

void down() {
handler.post(new Runnable() {
public void run() {
pBar.cancel();
update();
}
});
}

Installieren Sie die App

void update() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), Config.UPDATE_SAVENAME)),
"application/vnd.android.package-archive");
startActivity(intent);
}

Wenn Sie die APK veröffentlichen App Gehen Sie zum Markt. Sie werden feststellen, dass im Markt ein ähnliches Modul integriert ist, das automatisch aktualisiert werden kann oder Sie daran erinnert, ob die Anwendung aktualisiert werden soll. Wenn also Ihre eigene Anwendung automatisch aktualisiert werden muss, wäre es dann nicht bequemer, selbst eine zu erstellen? Der größte Teil des in diesem Artikel erwähnten Codes ist in UpdateActivity.Java implementiert. Um den Update-Prozess benutzerfreundlicher zu gestalten, können Sie in der Aktivität des ersten Launchers einen Thread erstellen, um zu überprüfen, ob Updates auf dem Server vorhanden sind. Starten Sie UpdateActivity, wenn ein Update vorliegt, was die Benutzererfahrung reibungsloser macht.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Weitere Artikel zum Thema Android-Anwendungen mit erzwungener Aktualisierung von APPs finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn