一,檢測是否需要更新
1-1,檢查當前的網絡狀態
1-2,獲取當前版本信息
1-3,檢測是否具有新版本,用戶選擇是否跟新
二,下載最新apk
2-1,下載最新版本的apk
三,啓動更新
3-1,啓動更新
1-1,檢查當前的網絡狀態:
/**
* 獲取網絡類型
*
* @param context Context
* @return 網絡類型
* @see [類、類#方法、類#成員]
*/
public static int getNetworkType(Context context) {
NetworkInfo networkInfo = getConnectedNetworkInfo(context);
if (networkInfo != null) {
return networkInfo.getType();
}
return -1;
}
public static NetworkInfo getConnectedNetworkInfo(Context context) {
try {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
Log.i(tag, "couldn't get connectivity manager");
} else {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return info[i];
}
}
}
}
} catch (Exception e) {
Log.i(tag, e.getMessage());
}
return null;
}
1-2,獲取當前版本信息
public void check(View view){
PackageManager manager = getPackageManager();
PackageInfo info = null;
try {
info = manager.getPackageInfo("com.wang.demo_android", 0);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tv_show.setText("versionCode:"+ info.versionCode +"; versionName:"+ info.versionName);
}
1-3,檢測是否具有新版本,用戶選擇是否跟新(一般的請求網絡,彈窗就好)
2-1,下載最新版本的apk,使用android 系統自帶的DownloadManager
mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
// 設置下載的網絡地址:url
Uri uri = Uri
.parse("http://gdown.baidu.com/data/wisegame/fd84b7f6746f0b18/baiduyinyue_4802.apk");
DownloadManager.Request down = new DownloadManager.Request(uri);
// 設置允許下載的網絡類型
down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE
| DownloadManager.Request.NETWORK_WIFI);
// 下載途中通知欄的顯示
down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
// 下載界面的顯示
down.setVisibleInDownloadsUi(true);
// 設置下載後文件的存放路徑
down.setDestinationInExternalFilesDir(getApplicationContext(),
Environment.DIRECTORY_DOWNLOADS, "baidumusic.apk");
// 添加到任務隊列
mDownloadManager.enqueue(down);
3-1,下載完成之後(使用廣播接收器),啓動更新
廣播接收:
class DownloadUpdateCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//安裝apk
if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())){
Log.i(tag, "onReceive");
//獲得下載文件的Id
long apkId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
Uri apkUri = mDownloadManager.getUriForDownloadedFile(apkId);
//自動安裝apk
installApk(apkUri);
UpdateService.this.stopSelf();
}
}
}
註冊:
registerReceiver(mDownloadUpdateCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
啓動安裝:
private void installApk(Uri apkUri) {
//通過Intent安裝apk
Log.i(tag, "uri-2->"+apkUri.getPath());
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.addCategory(android.content.Intent.CATEGORY_DEFAULT);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
getApplicationContext().startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
Log.i(tag, "installApk");
}
推薦:http://www.cnblogs.com/wainiwann/archive/2012/03/12/2391810.html