最近項目版本更新,需要幹掉以前的那種應用更新功能,當用戶點擊確定更新的時候更新在後頭默默的更新,同時在通知欄裏面顯示進度,下載完應用之後再跳到安裝頁面。本代碼的邏輯是在引導頁啓動一個異步的IntentService,檢查更新之後使用downLoadManager下載 核心代碼如下:
清單文件:
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter >
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
</intent-filter>
</receiver>
<service android:name=".DownLoadService" />
Activity裏面的版本號匹配:
/**
* 2 * 獲取版本號 3 * @return 當前應用的版本號 4
*/
public String getVersion() {
try {
PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
String version = info.versionName;
return this.getString(R.string.app_name) + version;
} catch (Exception e) {
e.printStackTrace();
return "找不到版本號";
}
}
// 版本號檢查的工具方法
// 版本號檢查的工具方法
private void checkTool(JSONObject response) {
JSONObject jsonObj = (JSONObject) response.opt("data");
String version = jsonObj.optString("version");
if (!getVersion().equals(version)) {
Dialog dialog = null;
String title = jsonObj.optString("title");
String content = jsonObj.optString("content");
final String downLoadUrl = jsonObj.optString("downloadUrl");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(content);
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
arg0.cancel();
}
});
builder.setPositiveButton("確定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int arg1) {
// TODO Auto-generated method stub
d.cancel();
Intent intent = new Intent(MainActivity.this,
DownLoadService.class);
intent.putExtra("downLoadUrl", downLoadUrl);
MainActivity.this.startService(intent);
}
});
dialog = builder.create();
dialog.show();
}
}
// 檢查版本
public void checkUpdate(final String versionCode, String url) {
RequestQueue requestQueue = Volley.newRequestQueue(this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if (response.optBoolean("success")) {
checkTool(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
arg0.printStackTrace();
System.out.println("sorry,Error");
}
});
requestQueue.add(jsonObjectRequest);
}
DownLodService裏面代碼如下:
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
String serviceString = Context.DOWNLOAD_SERVICE;
final DownloadManager downloadManager;
downloadManager = (DownloadManager)getSystemService(serviceString);
String downLoadUrl = intent.getStringExtra("downLoadUrl");
Log.e("download", "enter the service download"+downLoadUrl);
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse("http://count.liqucn.com/d.php?id=444776&urlos=android&from_type=web"));
request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
// 設置通知欄標題
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE);
request.setTitle("下載");
request.setDescription("貴金屬正在下載");
request.setAllowedOverRoaming(false);
// 設置文件存放目錄
/* File file = new File(Environment.DIRECTORY_DOWNLOADS);
if(!file.exists()){
file.mkdirs();
}*/
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myApp.apk");
MyReceiver.myReference =downloadManager.enqueue(request);
最後在廣播裏面監聽下載完成的事件:
public void onReceive(Context mContext, Intent intent) {
// TODO Auto-generated method stub
Log.e("MyReceiver", " enter thisi receiver");
if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
long id = intent
.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
System.out.println(id == myReference);
if (id == this.myReference) {
Intent startIntent = new Intent(Intent.ACTION_VIEW);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startIntent.setDataAndType(
Uri.fromFile(new File(Environment
.getExternalStorageDirectory()
+ "/download/myApp.apk")),
"application/vnd.android.package-archive");
mContext.startActivity(startIntent);
}
Toast.makeText(mContext, "下載完畢", 0).show();
} else if (intent.getAction().equals(
DownloadManager.ACTION_NOTIFICATION_CLICKED)) {
// Toast.makeText(MainActivity.this, "別瞎點!!!",
// Toast.LENGTH_SHORT).show();
}
}