Android 애플리케이션의 강제 업데이트는 매우 유용합니다. 특히 새로 출시되는 애플리케이션에는 확실히 버그가 많거나 적습니다. 특히 모바일 결제와 관련된 문제가 발생하면 상대적으로 큰 손실이 발생하므로 특히 업데이트가 필수입니다. 중요한.
일반적으로 강제 업데이트 전략은 다음과 같습니다.
애플리케이션이 시작되면 백그라운드를 요청하고 백그라운드는 최신 업데이트를 보냅니다. 애플리케이션 버전 정보(애플리케이션 버전 번호, 이름, 업데이트 내용 설명, 패키지 다운로드를 위한 서버 주소, 강제 업데이트 여부 플래그 포함) 등
이제 위의 아이디어를 바탕으로 구현 코드를 작성해 보겠습니다.
1. AndroidManifest 구성 버전 정보
각 Android apk의 버전 식별은 AndroidManifest.xml에 정의되어 있습니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.demo" android:versionCode="1" android:versionName="1.0.0"> <application> </application> </manifest>
그 중 package="com.demo"는 패키지 이름이고 android:versionCode="1"은 정수인 버전 코드입니다. 0 "은 문자열로 사용자에게 표시되는 버전 이름입니다.
AndroidManifest 파일에서 버전 번호와 버전 이름을 읽어야 할 경우 packageManager를 사용하여 쉽게 가져올 수 있습니다. 코드는 다음과 같습니다.
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. 버전 확인
최신 버전을 설치하세요. http://localhost/mydemo/demo.apk와 같은 서버 apk 파일
동시에 이 apk에 해당하는 버전 정보 호출 인터페이스나 파일을 서버에 배치합니다. ://localhost/mydemo/ ver.json
ver.json의 내용은
코드는 다음과 같습니다.
[{ "appname":"jtapp12","apkname ":"jtapp-12-updateapksamples.apk","verName":1.0.1,"verCode":2}]
그런 다음 읽고 모바일 클라이언트에서 버전을 확인하세요:
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; }
서버와 클라이언트 버전을 비교하고 업데이트 작업을 수행하세요.
if (getServerVerCode()) { int vercode = Config.getVerCode(this); // 用到前面第一节写的方法 if (newVerCode > vercode) { doNewVersionUpdate(); // 更新新版本 } else { notNewVersionShow(); // 提示当前为最新版本 } }
통화 방법:
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(); }
업데이트 다운로드:
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(); }
다운로드가 완료되고 핸들러를 통해 메인 UI 스레드에 다운로드 대화 상자를 취소하라는 알림이 전달됩니다.
void down() { handler.post(new Runnable() { public void run() { pBar.cancel(); update(); } }); }
애플리케이션 설치
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); }
apk 애플리케이션을 마켓에 출시하면 , 그런 다음 시장에 유사한 모듈이 내장되어 있음을 알게 될 것입니다. 이 모듈은 자동으로 업데이트하거나 애플리케이션 업데이트 여부를 알려줄 수 있습니다. 따라서 자신의 애플리케이션을 자동으로 업데이트해야 한다면 직접 구축하는 것이 더 편리하지 않을까요? 이 기사에 언급된 대부분의 코드는 UpdateActivity.Java에서 구현됩니다. 업데이트 프로세스를 보다 친숙하게 만들기 위해 초기 실행 프로그램의 활동에 스레드를 생성하여 서버에 업데이트가 있는지 확인할 수 있습니다. 업데이트가 있을 때 UpdateActivity를 시작하면 사용자 경험이 더 원활해집니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.
더 많은 안드로이드 앱 강제 업데이트 APP 관련 글을 보시려면 PHP 중국어 홈페이지를 주목해주세요!