安装的时候需要注意,需要开启设备“允许安装安卓市场上的应用”的选项。
其中对UI需要改变的地方通过发消息的方式:
mHandler.sendEmptyMessage(DOWNLOAD);
mHandler.sendEmptyMessage(FINISH_DIALOG);
延时发送消息:
Message message = mHandler.obtainMessage(DOWNLOAD_FINISH);
mHandler.sendMessageDelayed(message,2000);
消息处理:
private Handler mHandler = new Handler(){
public void handleMessage(Message msg)
{
switch (msg.what)
{
case DOWNLOAD:
mProgress.setProgress(progress);
prostate.setText(progress+"%100");
break;
case FINISH_DIALOG:
showFinishDialog();
break;
case DOWNLOAD_FINISH:
finishDialog.dismiss();
ApkInstall();
break;
default:
break;
}
}
};
}
整体的代码实现如下:
public class ApkupgradeActivity extends Activity {
Button updateBtn;
Button installBtn;
String TAG = "ApkupgradeActivity";
private static final int DOWNLOAD = 1;
private static final int DOWNLOAD_FINISH = 2;
private static final int FINISH_DIALOG = 3;
private ProgressBar mProgress;
private int progress;
Context mContext;
private boolean cancelUpdate = false;
private Dialog mDownloadDialog;
HashMap<String, String> hashMap;
Dialog finishDialog;
TextView prostate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_apkupgrade);
updateBtn = (Button) findViewById(R.id.btnUpdate);
updateBtn.setOnClickListener(click);
installBtn = (Button) findViewById(R.id.btnInstall);
installBtn.setOnClickListener(click);
mContext = getApplicationContext();
showNoticeDialog();
}
OnClickListener click = new OnClickListener(){
@Override
public void onClick(View v) {
if(v.getId()==R.id.btnUpdate){
//showNoticeDialog();
checkUpdate();
//new downloadApkThread().start();
}else if(v.getId()==R.id.btnInstall){
ApkInstall();
}
}
};
private class downloadApkThread extends Thread{
@Override
public void run()
{
dowloadApk();
//showDownloadDialog();
}
}
private void showDownloadDialog(){
AlertDialog.Builder builder = new Builder(ApkupgradeActivity.this);
builder.setTitle(R.string.soft_updating);
final LayoutInflater inflater = LayoutInflater.from(ApkupgradeActivity.this);
View v = inflater.inflate(R.layout.softupdate_progress, null);
mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
prostate = (TextView) v.findViewById(R.id.prostate);
builder.setView(v);
builder.setNegativeButton(R.string.soft_update_cancel, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 设置取消状态
cancelUpdate = true;
}
});
mDownloadDialog = builder.create();
mDownloadDialog.show();
// 现在文件
//downloadApk();
new downloadApkThread().start();
}
private void showFinishDialog(){
AlertDialog.Builder builder = new Builder(ApkupgradeActivity.this);
builder.setTitle(R.string.soft_finish_title);
builder.setMessage(R.string.soft_finish_info);
finishDialog = builder.create();
finishDialog.show();
Message message = mHandler.obtainMessage(DOWNLOAD_FINISH);
mHandler.sendMessageDelayed(message,2000);
}
private void showNoticeDialog()
{
AlertDialog.Builder builder = new Builder(ApkupgradeActivity.this);
builder.setTitle(R.string.soft_update_title);
builder.setMessage(R.string.soft_update_info);
builder.setPositiveButton(R.string.soft_update_updatebtn, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 显示下载对话框
showDownloadDialog();
}
});
builder.setNegativeButton(R.string.soft_update_later, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
}
void dowloadApk(){
//String savepath = getApplicationContext().getFilesDir().getPath()+"/data/user/";
//String savepath = "/data/user/";
Log.v(TAG,"into the dowloadApk");
String upgradefile = "http://192.168.21.243/upgrade.apk";
URL url = null;
try {
url = new URL(upgradefile);
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.connect();
int length = conn.getContentLength();
InputStream is = conn.getInputStream();
// File file = new File(savepath);
// if (!file.exists())
// {
// file.mkdir();
// }
//File apkFile = new File("/mnt/nand/", "upgrade.apk");
//FileOutputStream fos = new FileOutputStream(apkFile);
//FileOutputStream fos = getApplicationContext().openFileOutput("upgrade.apk",Context.MODE_PRIVATE);
FileOutputStream fos = getApplicationContext().openFileOutput("upgrade.apk",Context.MODE_WORLD_READABLE);
int count = 0;
byte buf[] = new byte[256];
int numread = 0;
do{
numread = is.read(buf,0,256);
count += numread;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.v(TAG,"dowloading the data numread:"+numread);
progress = (int) (((float) count / length) * 100);
mHandler.sendEmptyMessage(DOWNLOAD);
if(numread >= 0){
fos.write(buf, 0, numread);
}
if (numread <= 0)
{
break;
}
}while(!cancelUpdate);
fos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
mDownloadDialog.dismiss();
if(!cancelUpdate){
mHandler.sendEmptyMessage(FINISH_DIALOG);
}
if(cancelUpdate)
cancelUpdate = false;
Log.v(TAG,"out the dowloadApk");
}
private String getVersionCode(Context mcontext){
String versionCode = null;
try
{
versionCode = mcontext.getPackageManager().getPackageInfo("com.example.apkupgrade", 0).versionName;
} catch (NameNotFoundException e)
{
e.printStackTrace();
}
return versionCode;
}
private boolean isUpdate()
{
Log.v(TAG, "into the isUpdate function");
try {
URL url = new URL("http://192.168.21.243/version.xml");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setReadTimeout(5*1000);
conn.setRequestMethod("GET");
conn.connect();
InputStream verstream = conn.getInputStream();
ParseXmlService service = new ParseXmlService();
hashMap = service.parseXml(verstream);
Log.v(TAG, "version:"+hashMap.get("version"));
Log.v(TAG, "name:"+hashMap.get("name"));
Log.v(TAG, "url:"+hashMap.get("url"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
AlertDialog.Builder builder = new Builder(ApkupgradeActivity.this);
builder.setTitle(R.string.soft_update_state);
final LayoutInflater inflater = LayoutInflater.from(ApkupgradeActivity.this);
View v = inflater.inflate(R.layout.update_version, null);
TextView curversion = (TextView) v.findViewById(R.id.currversion);
curversion.setText(curversion.getText()+getVersionCode(ApkupgradeActivity.this));
TextView serversion = (TextView) v.findViewById(R.id.serversion);
serversion.setText(serversion.getText()+hashMap.get("version"));
TextView sername = (TextView) v.findViewById(R.id.sername);
sername.setText(sername.getText()+hashMap.get("name"));
TextView serurl = (TextView) v.findViewById(R.id.serurl);
serurl.setText(serurl.getText()+hashMap.get("url"));
builder.setView(v);
builder.setPositiveButton(R.string.soft_update_updatebtn, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 显示下载对话框
showDownloadDialog();
}
});
builder.setNegativeButton(R.string.soft_update_later, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
return false;
}
public void ApkInstall(){
//Intent intent = new Intent(this,InstallActivity.class);
//startActivity(intent);
String apkpath = getApplicationContext().getFilesDir().getPath() + "/upgrade.apk";
Uri uri = Uri.fromFile(new File(apkpath));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);
}
public void checkUpdate()
{
if (isUpdate())
{
// 显示提示对话框
showNoticeDialog();
} else
{
//Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show();
}
}
private Handler mHandler = new Handler(){
public void handleMessage(Message msg)
{
switch (msg.what)
{
case DOWNLOAD:
mProgress.setProgress(progress);
prostate.setText(progress+"%100");
break;
case FINISH_DIALOG:
showFinishDialog();
break;
case DOWNLOAD_FINISH:
finishDialog.dismiss();
ApkInstall();
break;
default:
break;
}
}
};
}