您的位置:首页 > 移动开发 > Android开发

Android应用程序实现自动更新功能4_实现的整体代码

2014-06-09 15:16 633 查看
安装的时候需要注意,需要开启设备“允许安装安卓市场上的应用”的选项。

其中对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;
}
}
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: