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

安装的时候需要注意,需要开启设备“允许安装安卓市场上的应用”的选项。

其中对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;
            }
        }
	};
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔波的IT人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值