參考:HTTP://ming-fanglin.javaeye.com/blog/795450

 

HTTP://www.androidres.com/index.php/2009/04/13/add-liveupdate-to-android-applications/

 

看了網上的一些東西 自己覺得 思路大致分三步:

 

1、檢查是否更新

 

2、下載最新apk檔

 

3、更新應用

 

代碼如下:

 

UpdateProject.java

 

package com.huitu.project;

 

import java.io.File;

 

import java.io.FileOutputStream;

 

import java.io.IOException;

 

import java.io.InputStream;

 

import java.util.List;

 

import org.apache.HTTP.HttpEntity;

 

import org.apache.HTTP.HttpResponse;

 

import org.apache.HTTP.client.ClientProtocolException;

 

import org.apache.HTTP.client.HttpClient;

 

import org.apache.HTTP.client.methods.HttpGet;

 

import org.apache.HTTP.impl.client.DefaultHttpClient;

 

import android.app.Activity;

 

import android.app.ActivityManager;

 

import android.app.ActivityManager.RunningAppProcessInfo;

 

import android.app.AlertDialog;

 

import android.app.Dialog;

 

import android.app.ProgressDialog;

 

import android.content.CoNtext;

 

import android.content.DialogInterface;

 

import android.content.Intent;

 

import android.content.SharedPreferences;

 

import android.content.SharedPreferences.Editor;

 

import android.content.pm.PackageInfo;

 

import android.net.Uri;

 

import android.os.Bundle;

 

import android.os.Environment;

 

import android.os.Handler;

 

import android.view.KeyEvent;

 

import com.huitu.util.HttpUtil;

 

public class UpdateProject extends Activity{

 

private ProgressDialog pd;

 

private Handler mProgressHandler = new Handler();

 

private Intent intent;

 

//private UninstallReceiver ur;

 

@Override

 

protected void onCreate(Bundle savedInstanceState) {

 

// TODO Auto-generated method stub

 

super.onCreate(savedInstanceState);

 

setContentView(R.layout.updateproject);

 

intent = new Intent(this,MainActivity.class);

 

SharedPreferences sp = getSharedPreferences("version", CoNtext.MODE_PRI加值稅E);

 

long lastUpdateTime = sp.getLong("lastUpdateTime", System.currentTimeMillis());

 

//更新間隔至少一天

 

//if(lastUpdateTime + (24*60*60*1000)<System.currentTimeMillis()){

 

lastUpdateTime = System.currentTimeMillis();

 

Editor editor = sp.edit();

 

editor.putLong("lastUpdateTime", lastUpdateTime);

 

editor.commit();

 

if(checkUpdate()){

 

Dialog dialog = new AlertDialog.Builder(this).setTitle("系統更新")

 

.setMessage("已有新版本,是否更新?")

 

.setPositiveButton("確定",new DialogInterface.OnClickListener() {

 

public void onClick(DialogInterface dialog, int which) {

 

pd = new ProgressDialog(UpdateProject.this);

 

pd.setMessage("正在更新,請稍後...");

 

pd.show();

 

down(HttpUtil.BASE_URL+"android_file/cpjw.apk");

 

}

 

})

 

.setNegativeButton("取消", new DialogInterface.OnClickListener() {

 

public void onClick(DialogInterface dialog, int which) {

 

startActivity(intent);

 

}

 

}).create();

 

dialog.show();

 

}else{

 

startActivity(intent);

 

}

 

// }else{

 

// startActivity(intent);

 

// }

 

}

 

//判斷是否需要更新

 

private boolean checkUpdate(){

 

String url = HttpUtil.BASE_URL+"android_checkUpdate.action";

 

try {

 

PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0);

 

int oldVersion = info.versionCode;

 

System.out.println(oldVersion);

 

String flat = HttpUtil.queryStringForPost(url);

 

int newVersion = Integer.parseInt(flat);

 

System.out.println(oldVersion+"============"+newVersion);

 

if(newVersion > oldVersion){

 

return true;

 

}

 

} catch (Exception e) {

 

// TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

return false;

 

}

 

private void down(final String url){

 

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(), "cpjw.apk");

 

fileOutputStream = new FileOutputStream(file);




byte[] buf = new byte[1024];

 

int ch = -1;

 

while ((ch = is.read(buf)) != -1) {

 

fileOutputStream.write(buf, 0, ch);

 

}

 

}

 

fileOutputStream.flush();

 

if (fileOutputStream != null) {

 

fileOutputStream.close();

 

}

 

update();




} catch (ClientProtocolException e) {

 

// TODO Auto-generated catch block

 

e.printStackTrace();

 

} catch (IOException e) {

 

// TODO Auto-generated catch block
e.printStackTrace();

}

}

}.start();

}

private void update() {

mProgressHandler.post(new Runnable() {

public void run() {

pd.cancel();

install();

finish();

}

});



}



private void install() {

Intent i = new Intent();

//i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

i.setAction(Intent.ACTION_VIEW);

i.setDataAndType(Uri.fromFile(new File("/sdcard/cpjw.apk")),

"application/vnd.android.package-archive");

startActivity(i);

//finish();

}



@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

// 按下鍵盤上返回按鈕

if (keyCode == KeyEvent.KEYCODE_BACK) {

new AlertDialog.Builder(this)

.setMessage("確定退出系統嗎?")

.setNegativeButton("取消",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int which) {

}

})

.setPositiveButton("確定",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int whichButton) {

finish();

}

}).show();

return true;

} else {

return super.onKeyDown(keyCode, event);

}

}

@Override

protected void onDestroy() {

super.onDestroy();

// 或者下面這種方式

//System.exit(0);

//建議用這種

android.os.Process.killProcess(android.os.Process.myPid());

}

}

首先 這個Activity 是在我們的應用啟動時 就轉到這個Activity裡面 判斷 更新 如果沒有更新 就轉到業務應用介面

1、判斷是否需要更新

主要是根據版本號 來控制 在清單檔裡面

<manifest xmlns:android="HTTP://schemas.android.com/apk/res/android"

package="com.huitu.project"

android:versionCode="1"

android:versionName="1.0">

我們在伺服器建一張表 表裡可以只有一條資料 這個資料就是最新的版本號

我們獲得這個版本號 如果大於手機當前版本號 就提示更新

2、下載最新apk

我們在伺服器 可以寫一個檔上傳的頁面 把檔上傳到一個固定的目錄下面 上傳成功後 還要更新資料庫最新版本號

3、更新apk

i.setAction(Intent.ACTION_VIEW);

i.setDataAndType(Uri.fromFile(new File("/sdcard/cpjw.apk")),

"application/vnd.android.package-archive");

startActivity(i);

這樣 就會開始安裝apk

但是 這裡有個問題 總是 提示「應用程式未安裝」

下載時成功了 但是就是安裝不上

我在手機上 也是安裝不上 只能把原來的應用卸載 然後安裝才會成功

後來 我就想 是不是可以在程式裡面先卸載 再安裝啊 於是:

// private void uninstall(){

// Intent intent = new Intent(Intent.ACTION_DELETE);

// Uri data = Uri.parse("package:"+this.getPackageName());

// intent.setData(data);

// startActivity(intent);

//   }

//

// private class UninstallReceiver extends BroadcastReceiver{

//

// @Override

// public void onReceive(CoNtext coNtext, Intent intent) {

// System.out.println("rrrrrrrrrrrrrrr");

// Toast.makeText(coNtext, "1345435", 1).show();

// install();

//   }

//

//   }

//

//

// @Override

// protected void onResume() {

// IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_DATA_CLEARED);

// filter.addAction(Intent.ACTION_PACKAGE_REMOVED);

// filter.addDataScheme("package");

// ur = new UninstallReceiver();

// registerReceiver(ur, filter);

// super.onResume();

//   }

@Override

protected void onDestroy() {

super.onDestroy();

// 或者下面這種方式

//System.exit(0);

//建議用這種

//取消註冊

unregisterReceiver(ur);

android.os.Process.killProcess(android.os.Process.myPid());

}
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()