精华内容
参与话题
问答
  • Node快速切换版本、版本回退(降级)、版本更新(升级) 场景 最近遇到一些node的坑,比如6.3.0版的node用不了公司最新的工作流,升级到10.x版的node后,又用不了另一套工作流。 问题 怎么实现node版本降级、升级?是否...

    Node快速切换版本、版本回退(降级)、版本更新(升级)

    场景

    最近遇到一些node的坑,比如6.3.0版的node用不了公司最新的工作流,升级到10.x版的node后,又用不了另一套工作流。

    问题

    怎么实现node版本降级、升级?是否可以安装多个版本按需要进行切换?

    解决方案一(n)

    (1)安装node版本管理模块n
    	sudo npm install n -g
    

    下边步骤请根据自己需要选择

    (2)安装稳定版
    	sudo n stable
    
    (3)安装最新版
    	sudo n latest
    
    (4) 版本降级/升级
    	sudo n 版本号
    

    比如需要8.4.0版:
    在这里插入图片描述

    (5)检测目前安装了哪些版本的node
    n
    

    如图,本人安装了四个版本,目前处于8.4.0:
    在这里插入图片描述

    (6)切换版本(不会删除已经安装的其他版本)
    n 版本号
    

    比如切换到11.4.0版:n 11.4.0,运行后查看版本号 ,可见当前已经处于11.4.0:
    在这里插入图片描述

    (7)删除版本
    sudo n rm 版本号
    

    比如删除本人电脑存在的6.9.1版可使用sudo n rm 6.9.1
    在这里插入图片描述
    输入密码,回车即可删除指定版本,如图,6.9.1已移除:
    在这里插入图片描述

    提示:

    演示系统:macOS High Sierra 10.13.2;sudo是mac下输入密码验证身份的命令,因此windows用户应该是以管理员身份运行命令行工具,然后删除sudo即可。
    举个例子:删除版本mac下是sudo n rm 版本号,windows下应该是n rm 版本号

    解决方案二(nvm)

    1)启动终端,cd ~,随后输入

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
    
    

    2)创建.bash_profile:输入“touch .bash_profile”

    3)编辑.bash_profile文件:输入“open .bash_profile”

    4)在弹出的.bash_profile文件内增加

      export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
    

    5)终端键入"command -v nvm",回车,如果输出了 “nvm”。代表已经安装成功。
    6)命令

    nvm install stable   //安装最新版 node
    
    nvm install [node版本号]   //安装指定版本的node
    
    nvm ls // 查看已安装版本
    
    nvm use [node版本号]   //切换到指定版本的node
    
    nvm alias default [node版本号] //设置默认版本
    

    nvm使用详情可参考:https://github.com/creationix/nvm

    展开全文
  • Android提示版本更新

    万次阅读 多人点赞 2014-05-07 10:43:10
    前言:

    前言:在软件开发的尾声应该都会遇到这个问题,还好网上资料很多,所以基本不费什么力气就搞定了,现记录于下。这里用的PHP服务器。

     效果图:(PHP服务器)

                       初始界面                      检测后,如果已是最新版

                                            

    如果不是最新版,提示更新                  正在下载                             安装新程序    

         

     一、准备知识

     在AndroidManifest.xml里定义了每个Android apk的版本标识:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.try_downloadfile_progress"
        android:versionCode="1"
        android:versionName="1.0" >

    其中,android:versionCode和android:versionName两个字段分别表示版本代码,版本名称。versionCode是整型数字,versionName是字符串。由于version是给用户看的,不太容易比较大小,升级检查时,可以以检查versionCode为主,方便比较出版本的前后大小。
    那么,在应用中如何读取AndroidManifest.xml中的versionCode和versionName呢?可以使用PackageManager的API,参考以下代码:

    	/**
    	 * 获取软件版本号
    	 * @param context
    	 * @return
    	 */
    	public static int getVerCode(Context context) {
            int verCode = -1;
            try {
            	//注意:"com.example.try_downloadfile_progress"对应AndroidManifest.xml里的package="……"部分
                verCode = context.getPackageManager().getPackageInfo(
                        "com.example.try_downloadfile_progress", 0).versionCode;
            } catch (NameNotFoundException e) {
            	Log.e("msg",e.getMessage());
            }
            return verCode;
        }
       /**
        * 获取版本名称
        * @param context
        * @return
        */
        public static String getVerName(Context context) {
            String verName = "";
            try {
                verName = context.getPackageManager().getPackageInfo(
                        "com.example.try_downloadfile_progress", 0).versionName;
            } catch (NameNotFoundException e) {
            	Log.e("msg",e.getMessage());
            }
            return verName;   
    }

    这里要注意一个地方:代码里的“com.example.try_downloadfile_progress”对应AndroidManifest.xml里的package="……"部分

    二、XML代码 

     XML代码非常简单,就是如初始化界面那样,在里面加一个BUTTON而已。代码如下:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        tools:context=".MainActivity" >
    
        <Button 
            android:id="@+id/chek_newest_version"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dip"
            android:text="检测最新版本"/>
    
    </RelativeLayout>

    三、辅助类构建(Common)

     这里为了开发方便,将一些公共的函数,单独放在Common类中实现,代码如下:

    package com.example.try_downloadfile_progress;
    /**
     * @author harvic
     * @date 2014-5-7
     * @address http://blog.csdn.net/harvic880925
     */
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.List;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.protocol.HTTP;
    
    import android.content.Context;
    import android.content.pm.PackageManager.NameNotFoundException;
    import android.util.Log;
    
    public class Common {
    	public static final String SERVER_IP="http://192.168.1.105/";
    	public static final String SERVER_ADDRESS=SERVER_IP+"try_downloadFile_progress_server/index.php";//软件更新包地址
    	public static final String UPDATESOFTADDRESS=SERVER_IP+"try_downloadFile_progress_server/update_pakage/baidu.apk";//软件更新包地址
    
    	/**
    	 * 向服务器发送查询请求,返回查到的StringBuilder类型数据
    	 * 
    	 * @param ArrayList
    	 *            <NameValuePair> vps POST进来的参值对
    	 * @return StringBuilder builder 返回查到的结果
    	 * @throws Exception
    	 */
    	public static StringBuilder post_to_server(List<NameValuePair> vps) {
    		DefaultHttpClient httpclient = new DefaultHttpClient();
    		try {
    			HttpResponse response = null;
    			// 创建httpost.访问本地服务器网址
    			HttpPost httpost = new HttpPost(SERVER_ADDRESS);
    			StringBuilder builder = new StringBuilder();
    
    			httpost.setEntity(new UrlEncodedFormEntity(vps, HTTP.UTF_8));
    			response = httpclient.execute(httpost); // 执行
    
    			if (response.getEntity() != null) {
    				// 如果服务器端JSON没写对,这句是会出异常,是执行不过去的
    				BufferedReader reader = new BufferedReader(
    						new InputStreamReader(response.getEntity().getContent()));
    				String s = reader.readLine();
    				for (; s != null; s = reader.readLine()) {
    					builder.append(s);
    				}
    			}
    			return builder;
    
    		} catch (Exception e) {
    			// TODO: handle exception
    			Log.e("msg",e.getMessage());
    			return null;
    		} finally {
    			try {
    				httpclient.getConnectionManager().shutdown();// 关闭连接
    				// 这两种释放连接的方法都可以
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				Log.e("msg",e.getMessage());
    			}
    		}
    	}
    	
    	/**
    	 * 获取软件版本号
    	 * @param context
    	 * @return
    	 */
    	public static int getVerCode(Context context) {
            int verCode = -1;
            try {
            	//注意:"com.example.try_downloadfile_progress"对应AndroidManifest.xml里的package="……"部分
                verCode = context.getPackageManager().getPackageInfo(
                        "com.example.try_downloadfile_progress", 0).versionCode;
            } catch (NameNotFoundException e) {
            	Log.e("msg",e.getMessage());
            }
            return verCode;
        }
       /**
        * 获取版本名称
        * @param context
        * @return
        */
        public static String getVerName(Context context) {
            String verName = "";
            try {
                verName = context.getPackageManager().getPackageInfo(
                        "com.example.try_downloadfile_progress", 0).versionName;
            } catch (NameNotFoundException e) {
            	Log.e("msg",e.getMessage());
            }
            return verName;   
    }	
    	
    }


    这里除了上面我们提到的两个函数getVerCode和getVerName外,还有几个常量和一个函数定义,含义分别如下:

    SERVER_IP:服务器IP地址(大家在拿到试验的时候,要改成自己服务器IP地址) 
    SERVER_ADDRESS:android程序要将请求发送到的页面地址,无须更改。
    UPDATESOFTADDRESS:更新安装包存放的位置,无须更改。

     函数StringBuilder post_to_server(List<NameValuePair> vps)是访问服务器并返回结果的功能封装。传进去名值对,返回StringBuilder对象

     四、主页面代码构建

     1、首先设置AndroidManifest.xml,使其能访问网络和SD卡

    在</manifest>标签上面,加入:

    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>

    2、主页代码:

    先贴出全部代码,然后逐步讲解,全部代码如下:

    package com.example.try_downloadfile_progress;
    /**
     * @author harvic
     * @date 2014-5-7
     * @address http://blog.csdn.net/harvic880925
     */
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    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 org.apache.http.message.BasicNameValuePair;
    import org.json.JSONArray;
    
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.ProgressDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
    	Button m_btnCheckNewestVersion;
    	long m_newVerCode; //最新版的版本号
    	String m_newVerName; //最新版的版本名
    	String m_appNameStr; //下载到本地要给这个APP命的名字
    	
    	Handler m_mainHandler;
    	ProgressDialog m_progressDlg;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		//初始化相关变量
    		initVariable();
    		
    		m_btnCheckNewestVersion.setOnClickListener(btnClickListener);
    	}
    	private void initVariable()
    	{
    		m_btnCheckNewestVersion = (Button)findViewById(R.id.chek_newest_version);
    		m_mainHandler = new Handler();
    		m_progressDlg =  new ProgressDialog(this);
    		m_progressDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    		 // 设置ProgressDialog 的进度条是否不明确 false 就是不设置为不明确     
    		m_progressDlg.setIndeterminate(false);    
    		m_appNameStr = "haha.apk";
    	}
    	
    	OnClickListener btnClickListener = new View.OnClickListener() {
    		
    		@Override
    		public void onClick(View v) {
    			// TODO Auto-generated method stub
    			new checkNewestVersionAsyncTask().execute();
    		}
    	};
    	
    	class checkNewestVersionAsyncTask extends AsyncTask<Void, Void, Boolean>
    	{
    
    		@Override
    		protected Boolean doInBackground(Void... params) {
    			// TODO Auto-generated method stub
    			if(postCheckNewestVersionCommand2Server())
    			{
    				int vercode = Common.getVerCode(getApplicationContext()); // 用到前面第一节写的方法  
    		         if (m_newVerCode > vercode) {  
    		             return true;
    		         } else {  
    		             return false;
    		         }  
    			}
    			return false;
    		}
    		
    		@Override
    		protected void onPostExecute(Boolean result) {
    			// TODO Auto-generated method stub
    			if (result) {//如果有最新版本
    				doNewVersionUpdate(); // 更新新版本  
    			}else {
    				notNewVersionDlgShow(); // 提示当前为最新版本  
    			}
    			super.onPostExecute(result);
    		}
    		
    		@Override
    		protected void onPreExecute() {
    			// TODO Auto-generated method stub
    			super.onPreExecute();
    		}
    	}
    	
    	/**
    	 * 从服务器获取当前最新版本号,如果成功返回TURE,如果失败,返回FALSE
    	 * @return
    	 */
    	private Boolean postCheckNewestVersionCommand2Server()
    	{
    		StringBuilder builder = new StringBuilder();
    		JSONArray jsonArray = null;
    		try {
    			// 构造POST方法的{name:value} 参数对
    			List<NameValuePair> vps = new ArrayList<NameValuePair>();
    			// 将参数传入post方法中
    			vps.add(new BasicNameValuePair("action", "checkNewestVersion"));
    			builder = Common.post_to_server(vps);
    			jsonArray = new JSONArray(builder.toString());
    			if (jsonArray.length()>0) {
    				if (jsonArray.getJSONObject(0).getInt("id") == 1) {
    					m_newVerName = jsonArray.getJSONObject(0).getString("verName");
    					m_newVerCode = jsonArray.getJSONObject(0).getLong("verCode");
    					
    					return true;
    				}
    			}
    	
    			return false;
    		} catch (Exception e) {
    			Log.e("msg",e.getMessage());
    			m_newVerName="";
    			m_newVerCode=-1;
    			return false;
    		}
    	}
    	
    	/**
    	 * 提示更新新版本
    	 */
    		private void doNewVersionUpdate() {
    			int verCode = Common.getVerCode(getApplicationContext());  
    		    String verName = Common.getVerName(getApplicationContext());  
    		    
    		    String str= "当前版本:"+verName+" Code:"+verCode+" ,发现新版本:"+m_newVerName+
    		    		" Code:"+m_newVerCode+" ,是否更新?";  
    		    Dialog dialog = new AlertDialog.Builder(this).setTitle("软件更新").setMessage(str)  
    		            // 设置内容  
    		            .setPositiveButton("更新",// 设置确定按钮  
    		                    new DialogInterface.OnClickListener() {  
    		                        @Override  
    		                        public void onClick(DialogInterface dialog,  
    		                                int which) { 
    		                            m_progressDlg.setTitle("正在下载");  
    		                            m_progressDlg.setMessage("请稍候...");  
    		                            downFile(Common.UPDATESOFTADDRESS);  //开始下载
    		                        }  
    		                    })  
    		            .setNegativeButton("暂不更新",  
    		                    new DialogInterface.OnClickListener() {  
    		                        public void onClick(DialogInterface dialog,  
    		                                int whichButton) {  
    		                            // 点击"取消"按钮之后退出程序  
    		                            finish();  
    		                        }  
    		                    }).create();// 创建  
    		    // 显示对话框  
    		    dialog.show();  
    		}
    		/**
    		 *  提示当前为最新版本  
    		 */
    		private void notNewVersionDlgShow()
    		{
    			int verCode = Common.getVerCode(this);  
    		    String verName = Common.getVerName(this); 
    		    String str="当前版本:"+verName+" Code:"+verCode+",/n已是最新版,无需更新!";
    		    Dialog dialog = new AlertDialog.Builder(this).setTitle("软件更新")  
    		            .setMessage(str)// 设置内容  
    		            .setPositiveButton("确定",// 设置确定按钮  
    		                    new DialogInterface.OnClickListener() {  
    		                        @Override  
    		                        public void onClick(DialogInterface dialog,  
    		                                int which) {  
    		                            finish();  
    		                        }  
    		                    }).create();// 创建  
    		    // 显示对话框  
    		    dialog.show();  
    		}
    		private void downFile(final String url)
    		{
    			m_progressDlg.show();  
    		    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();  
    		                
    		                m_progressDlg.setMax((int)length);//设置进度条的最大值
    		                
    		                InputStream is = entity.getContent();  
    		                FileOutputStream fileOutputStream = null;  
    		                if (is != null) {  
    		                    File file = new File(  
    		                            Environment.getExternalStorageDirectory(),  
    		                            m_appNameStr);  
    		                    fileOutputStream = new FileOutputStream(file);  
    		                    byte[] buf = new byte[1024];  
    		                    int ch = -1;  
    		                    int count = 0;  
    		                    while ((ch = is.read(buf)) != -1) {  
    		                        fileOutputStream.write(buf, 0, ch);  
    		                        count += ch;  
    		                        if (length > 0) {  
    		                        	 m_progressDlg.setProgress(count);
    		                        }  
    		                    }  
    		                }  
    		                fileOutputStream.flush();  
    		                if (fileOutputStream != null) {  
    		                    fileOutputStream.close();  
    		                }  
    		                down();  
    		            } catch (ClientProtocolException e) {  
    		                e.printStackTrace();  
    		            } catch (IOException e) {  
    		                e.printStackTrace();  
    		            }  
    		        }  
    		    }.start();  
    		}
    		private void down() {
    	        m_mainHandler.post(new Runnable() {
    	            public void run() {
    	                m_progressDlg.cancel();
    	                update();
    	            }
    	        });
    	}
    		
    	    void update() {
    	        Intent intent = new Intent(Intent.ACTION_VIEW);
    	        intent.setDataAndType(Uri.fromFile(new File(Environment
    	                .getExternalStorageDirectory(), m_appNameStr)),
    	                "application/vnd.android.package-archive");
    	        startActivity(intent);
    	    }
    
    
    }
    
    逐步讲解:

    1、OnCreate函数:

    先从主函数开始讲,OnCreate函数中只有两部分,一个是initVariable()初始化变量,这个不多说,难度不大;第二个是为版本检测按钮设置监听函数——btnClickListener,而在btnClickListener函数中可以明显的看到,其中也只有一个类checkNewestVersionAsyncTask,这里采用异步方式处理更新问题。下面看checkNewestVersionAsyncTask函数

    2、checkNewestVersionAsyncTask函数

    class checkNewestVersionAsyncTask extends AsyncTask<Void, Void, Boolean>
    {
    
    	@Override
    	protected Boolean doInBackground(Void... params) {
    		// TODO Auto-generated method stub
    		if(postCheckNewestVersionCommand2Server())
    		{
    			int vercode = Common.getVerCode(getApplicationContext()); // 用到前面第一节写的方法  
    	         if (m_newVerCode > vercode) {  
    	             return true;
    	         } else {  
    	             return false;
    	         }  
    		}
    		return false;
    	}
    	
    	@Override
    	protected void onPostExecute(Boolean result) {
    		// TODO Auto-generated method stub
    		if (result) {//如果有最新版本
    			doNewVersionUpdate(); // 更新新版本  
    		}else {
    			notNewVersionDlgShow(); // 提示当前为最新版本  
    		}
    		super.onPostExecute(result);
    	}
    	
    	@Override
    	protected void onPreExecute() {
    		// TODO Auto-generated method stub
    		super.onPreExecute();
    	}
    }

    (1)首先看后台操作doInBackground

    首先利用postCheckNewestVersionCommand2Server()函数将请求发送到服务器,该函数根据是否请求成功返回TRUE或FALSE,然后将从服务器上获取的版本代码与本地的版本代码进行比较,如果要更新返回TRUE,如果不要更新返回FASLE。

    下面看看postCheckNewestVersionCommand2Server()的代码:

    private Boolean postCheckNewestVersionCommand2Server()
    {
    	StringBuilder builder = new StringBuilder();
    	JSONArray jsonArray = null;
    	try {
    		// 构造POST方法的{name:value} 参数对
    		List<NameValuePair> vps = new ArrayList<NameValuePair>();
    		// 将参数传入post方法中
    		vps.add(new BasicNameValuePair("action", "checkNewestVersion"));
    		builder = Common.post_to_server(vps);
    		jsonArray = new JSONArray(builder.toString());
    		if (jsonArray.length()>0) {
    			if (jsonArray.getJSONObject(0).getInt("id") == 1) {
    				m_newVerName = jsonArray.getJSONObject(0).getString("verName");
    				m_newVerCode = jsonArray.getJSONObject(0).getLong("verCode");
    				
    				return true;
    			}
    		}
    
    		return false;
    	} catch (Exception e) {
    		Log.e("msg",e.getMessage());
    		m_newVerName="";
    		m_newVerCode=-1;
    		return false;
    	}
    }

    这里就是构建名值对,然后发向服务器,如果获取到了值就返回TURE,如果没获取到值,就返回FALSE。服务器返回的JSON值为:

    [{"id":"1","verName":"1.0.1","verCode":"2"}]

    对于服务器代码,由于是用PHP写的,这里就不再列出了,在源码里有。

    (2)onPostExecute()
    继续第一部分,在doInBackground操作完成后,如果需要更新doInBackground返回TRUE,否则返回FASLE,所以在onPostExecute
    中根据result不同调用不同的函数,利用doNewVersionUpdate(); 提示用户更新最新版本。利用notNewVersionDlgShow(); /提示用户当前即为最新版本,无需更新。

    对于notNewVersionDlgShow()函数仅仅是创建了个对话框,没什么实体内容,就不再具体讲解。下面具体讲述doNewVersionUpdate()下载,更新与安装程序的过程。

    3、doNewVersionUpdate()提示版本更新
    具体代码如下:

    private void doNewVersionUpdate() {
    	int verCode = Common.getVerCode(getApplicationContext());  
        String verName = Common.getVerName(getApplicationContext());  
        
        String str= "当前版本:"+verName+" Code:"+verCode+" ,发现新版本:"+m_newVerName+
        		" Code:"+m_newVerCode+" ,是否更新?";  
        Dialog dialog = new AlertDialog.Builder(this).setTitle("软件更新").setMessage(str)  
                // 设置内容  
                .setPositiveButton("更新",// 设置确定按钮  
                        new DialogInterface.OnClickListener() {  
                            @Override  
                            public void onClick(DialogInterface dialog,  
                                    int which) { 
                                m_progressDlg.setTitle("正在下载");  
                                m_progressDlg.setMessage("请稍候...");  
                                downFile(Common.UPDATESOFTADDRESS);  //开始下载
                            }  
                        })  
                .setNegativeButton("暂不更新",  
                        new DialogInterface.OnClickListener() {  
                            public void onClick(DialogInterface dialog,  
                                    int whichButton) {  
                                // 点击"取消"按钮之后退出程序  
                                finish();  
                            }  
                        }).create();// 创建  
        // 显示对话框  
        dialog.show();  
    }

    这里创建一个具有确定按钮和取消按钮功能的对话框,如果用户点击取消按钮,会利用finish()结束掉程序运行;如果点击确定按钮,则利用 downFile(Common.UPDATESOFTADDRESS); 函数开始程序下载,其中downFile()函数传进去的参数是APP所在的服务器地址。注意这里的地址要具体到下载文件,比如这里是http://192.168.1.105/server/XXX.apk

    4、downFile(final String url)下载并显示进度

    具体代码如下:

    private void downFile(final String url)
    {
    	m_progressDlg.show();  
        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();  
                    
                    m_progressDlg.setMax((int)length);//设置进度条的最大值
                    
                    InputStream is = entity.getContent();  
                    FileOutputStream fileOutputStream = null;  
                    if (is != null) {  
                        File file = new File(  
                                Environment.getExternalStorageDirectory(),  
                                m_appNameStr);  
                        fileOutputStream = new FileOutputStream(file);  
                        byte[] buf = new byte[1024];  
                        int ch = -1;  
                        int count = 0;  
                        while ((ch = is.read(buf)) != -1) {  
                            fileOutputStream.write(buf, 0, ch);  
                            count += ch;  
                            if (length > 0) {  
                            	 m_progressDlg.setProgress(count);//设置当前进度
                            }  
                        }  
                    }  
                    fileOutputStream.flush();  
                    if (fileOutputStream != null) {  
                        fileOutputStream.close();  
                    }  
                    down();  //告诉HANDER已经下载完成了,可以安装了
                } catch (ClientProtocolException e) {  
                    e.printStackTrace();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }.start();  
    }

    通过利用httpClient的get方法,获取指定URL的内容,然后写到本地SD卡中,对于进度条,首先利用m_progressDlg.setMax((int)length);设置进度条的最大值,然后在读取返回结果并写到本地时,利用 m_progressDlg.setProgress(count);设置当前进度。在全部写完以后,调用down()函数,通知HANDER安装程序。
    5、安装程序

    安装程序主要利用下面两个函数:

    /**
     * 告诉HANDER已经下载完成了,可以安装了
     */
    private void down() {
            m_mainHandler.post(new Runnable() {
                public void run() {
                    m_progressDlg.cancel();
                    update();
                }
            });
    }
    /**
     * 安装程序
     */
    void update() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(new File(Environment
                .getExternalStorageDirectory(), m_appNameStr)),
                "application/vnd.android.package-archive");
        startActivity(intent);
    }

    由于在android程序中必须依循单线程操作UI,所以在非主线程中不能操作UI,否则程序会崩掉,具体参见:《AsnyncTask与handler(一)——AsyncTask异步处理》与《AsnyncTask与handler(二)——handler消息机制》。所以这里作用handler的方式更新UI。

    好了,到这就全部讲完了,下面给出客户端与服务器端源码,懂PHP的童鞋赚到了有木有……

     

    源码地址:http://download.csdn.net/detail/harvic880925/7309013 不要分,仅供分享。

     

     请大家尊重作者原创版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/25191159 不胜感激。

    展开全文
  • node版本更新和npm版本更新

    万次阅读 2018-03-09 23:12:43
    node版本更新 查看node版本 node -v 查看node的安装路径 where node 在github查找gnvm并下载,把下载后对应系统位数的exe执行文件拷贝到node的安装目录中 打开cmd控制台,gnvm update latest 安装最新版本node ...

    node版本更新

    查看node版本 node -v

    查看node的安装路径 where node

    在github查找gnvm并下载,把下载后对应系统位数的exe执行文件拷贝到node的安装目录中

    打开cmd控制台,gnvm update latest 安装最新版本node

    把node的exe文件拷贝到node的安装目录中

    npm版本更新

    npm install -g npm

    大功告成 yeah!

    展开全文
  • FreeRTOS历史版本更新记录

    万次阅读 多人点赞 2016-05-28 16:57:41
    另一方面,会慢慢补上V8.0之后的版本更新内容。 说明:我上传FreeRTOS源码是为了为网友提供方便,为了增加上传权限才每个资源设置1个积分,想着等阵子权限足够了就把积分设置成0。但是现在CSDN官方强制自动设置每个...

    前言:本文会不定期更新,一方面FreeRTOS发布新版本时会第一时间跟进;另一方面,会慢慢补上V8.0之后的版本更新内容。

    说明:我上传FreeRTOS源码是为了为网友提供方便,为了增加上传权限才每个资源设置1个积分,想着等阵子权限足够了就把积分设置成0。但是现在CSDN官方强制自动设置每个资源需要的下载积分!我上传的资源有一个竟然设置成了需要44积分才能下载,所以不建议从CSDN下载,可以点击这里下载。

    FreeRTOS V9.0.0相对于FreeRTOS V9.0.0rc2更新记录:

            FreeRTOSV9.0.0发行于2016.05.25,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

             内核更新:

    • 修改新API函数xTaskCreateStatic()的原型,去除一个参数并且改善和其它"CreateStatic()" API函数的兼容性。点击此处查看更多信息。

     

            在FreeRTOS V9.0.0rc2版本中,xTaskCreateStatic()原型为:

     

              BaseType_txTaskCreateStatic( TaskFunction_t pxTaskCode,
                                   	const char * const pcName,
                                  	constuint32_t ulStackDepth,
                                   	void* const pvParameters,
                                  	UBaseType_t uxPriority,
                                   	TaskHandle_t*pxCreatedTask,
                                  	StackType_t * const puxStackBuffer,
                                  	StaticTask_t * const pxTaskBuffer );

     

            在FreeRTOS V9.0.0正式版中,xTaskCreateStatic()原型为:

     

             TaskHandle_txTaskCreateStatic( TaskFunction_t pxTaskCode,
                                    const char * const pcName,
                                    const uint32_t ulStackDepth,
                                    void * const pvParameters,
                                    UBaseType_t uxPriority,
                                    StackType_t * const puxStackBuffer,
                           		StaticTask_t * const pxTaskBuffer );

     

     

            注:博主看过FreeRTOS V9.0.0rc2版,也看过V9.0.0正式版,发现两个版本函数xTaskCreateStatic()是相同的。

     

    • GCC ARM Cortex-A移植层接口:增加configUSE_TASK_FPU_SUPPORT配置宏。当这个宏设置为2时,每一个任务自动使用浮点(FPU)环境。
    • GCC ARM Cortex-A移植层接口:使用vApplicationFPUSafeIRQHandler()来代替vApplicationIRQHandler()可以在任意中断嵌套入口处自动保存和恢复所有浮点寄存器。
    • 所有ARMCortex-M3/4F/7移植层接口:当使用ARM Cortex-M3/4/7架构文件而要求严格一致的创建任务时,清除位于任务堆栈中的任务入口地址的最低有效位(通常不会有什么明显作用,除非使用QMEU仿真器)。
    • 增加GCC和Keil ARMCortex-M4F MPU移植层接口,之前仅ARM Cortex-M3支持使用MPU。
    • ARM Cortex-M3/4F MPU移植层接口:现在完全支持FreeRTOS V9.0.0 API,增加一个演示例程,展示如何使用更新后的MPU移植层接口。演示例程位于:FreeRTOS/Demo/CORTEX_MPU_Simulator_Keil_GCC。
    • 所有ARMCortex-M3/4F/7移植层接口:在默认低功耗Tickless实现中增加同步指令。
    • 所有ARMCortex-M0移植层接口:防止第一个运行任务堆栈的项目被丢弃。
    • Win32移植层接口:减少堆栈的使用数目,改变删除Windows线程方法,增加最大执行时间。
    • 增加用于MikroC编译器的ARMCortex-M4F移植层接口。
    • MPS430X IAR移植层接口:更新至和最新的EW430工具一致。
    • IAR32 GCC移植层接口:纠正当onfigMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY时,函数vPortExitCritical()的错误。
    • 更新一致性:函数vTaskGetTaskInfo()现在有一个别名为vTaskGetInfo()、函数xTaskGetTaskHandle()现在有一个别名为xTaskGetHandle()、函数pcQueueGetQueueName()现在有一个别名为pcQueueGetName()。
    • 修改其它注释错误和编译器警告。

            演示例程更新:

    • 更新AtmelStudio工程,现在可使用Atmel Studio 7编译。
    • 更新Xilinx SDK版本,使用2016.01月版本。
    • PIC32演示例程中,删除依赖IO库的部分。
    • 将XilinxUltraScale Cortex-R5演示例程移动到主目录下。
    • l  MSP432库更新到最新版本。
    • l  增加使用GCC、Keil和MikroC编译器的MicrochipCEC1302 (ARM Cortex-M4F)演示例程。
    • l  将AtmelSAMA5D2演示例程移动到主目录下。

     

    FreeRTOS V9.0.0rc2相对于FreeRTOS V9.0.0rc1更新记录:

             FreeRTOSV9.0.0rc2发行于2016.03.30,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

     

    • 使用静态内存分配方法创建RTOS对象更简单了,如果传递的缓冲区参数是NULL,则不能转成动态内存分配,而是返回错误信息。
    • 增加configSUPPORT_DYNAMIC_ALLOCATION配置宏,允许应用程序不使用堆空间(设置为0)。
    • 小幅优化运行时间。
    • 新增两个基于SiliconLabs EFM32微控制器的Tickless低功耗实现例子。
    • 增加API函数xTimerGetPeriod()和xTimerGetExpireTime()。

     

     

    FreeRTOS V9.0.0rc1相对于FreeRTOS V8.2.3更新记录:

             FreeRTOSV9.0.0rc1发行于2016.02.19,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

             RTOS内核更新:

    • 主要新功能:现在可以使用静态分配内存创建任务、信号量、队列、定时器和事件组,因此可以完全不需要调用pvPortMalloc()函数。
    • 主要新功能:增加API函数xTaskAbortDelay(),允许一个任务强制另一个任务立即离开阻塞状态,即使被阻塞的任务等待的事件还没发生,或者被阻塞的任务超时定时器还没有超时。
    • 一些必要更新,允许FreeRTOS运行在64位架构上。
    • 增加函数vApplicationDaemonTaskStartupHook()。当RTOS守护进程(被定时器服务任务调用)启动运行时执行。如果应用程序希望启动调度器后再执行某些初始化代码,这个函数是比较有用。
    • 增加API函数xTaskGetTaskHandle(),用于根据任务名称获取任务句柄。这个函数使用多重字符串比较操作,比较费时,因此建议一个任务只使用一次,将获取的任务句柄保存到局部变量中,下次使用这个局部变量中保存的值。
    • 增加API函数pcQueueGetQueueName(),用于根据队列句柄获取队列名字。
    • 现在,即使configUSE_PREEMPTION配置为0,也可以使用Tickless空闲(用于低功耗应用,通过降低系统节拍定时器中断频率使CPU长期处于低功耗状态)了。
    • 现在,如果一个任务删除另外一个任务,被删除任务的堆栈和TCB立即释放。如果一个任务删除自己,则任务的堆栈和TCB和以前一样,通过空闲任务删除。
    • 在中断服务程序中,如果使用任务通知解除任务阻塞状态,但是参数xHigherPriorityTaskWoken并没有使用(正确情况下,使用这个参数来人为判断是否要进行上下文切换),则下次系统节拍时钟中断将会挂起一个上下文切换请求。
    • heap_1.c和heap_2.c现在可以使用configAPPLICATION_ALLOCATED_HEAP设置选项,以前这个选项仅用在heap_4.c。configAPPLICATION_ALLOCATED_HEAP允许应用程序自己定义一个数组来代替FreeRTOS的堆,数组必须为:uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];这样做的好处是程序可以指定堆的存储位置,比如内部RAM或外扩RAM等。
    • 现在,TaskStatus_t结构体包含任务堆栈的基地址了。TaskStatus_t结构体用于获取任务的详细信息,一般用在可视化追踪调试中。
    • 增加API函数vTaskGetTaskInfo(),用于返回一个TaskStatus_t结构体,结构体包含单个任务的信息。以前这个信息只能通过调用一个获取所有任务信息的API函数(uxTaskGetSystemState())间接得到(使用TaskStatus_t结构体数组存储这些信息)。
    • 增加API函数uxSemaphoreGetCount(),用于计数信号量,返回当前的计数值。
    • 优化Cortex-M3移植层接口

             演示例程更新:

    • 更新SAM4L AtmelStudio工程,Atmel Studio 7可以使用该工程了
    • 增加ARMCortex-A53 64位移植层接口
    • 增加用于Xilinx公司产品UltrascaleMPSoC的移植层接口和演示例程
    • 增加Cortex-M7SAME70 GCC演示例程
    • 增加EFM32 Giant和Wonder Gecko演示例程

     

     

     FreeRTOS V8.2.3相对于FreeRTOS V8.2.2更新记录:

     

    FreeRTOSV8.2.3发行于2015.10.16,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载 ,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

     

    内核更新:

    • 修正被确定的BUG,当使用软件定时器时,V8.2.2版本修改的软件定时器代码,会导致tickless低功耗应用无限期睡眠。
    • 简化并改善堆栈溢出检查效率
    • 增加API函数xTaskNotifyStateClear()
    • 新增IAR和GCC编译器下的Cortex-R微处理器移植层接口,但是不能使用ARM通用中断控制器。
    • 新增PIC32MEC14xx移植层接口。
    • PIC32MZ 移植层接口中增加对PIC32MZ EF(使用浮点)的支持。
    • Zynq7000移植层接口现在使用弱符号(比如启动文件中经常出现的“[WEAK]”)声明设置和清除系统节拍时钟中断函数,因此它们可以被应用程序覆写。
    • 增加configUSE_TASK_FPU_SUPPORT配置宏,尽管当前只有PIC32MZ EF移植层使用这个宏。
    • 更新RL78和78K0 IAR移植层接口,改善对组合内存模型的支持。
    • 小幅更新heap_5.c,移除引起某些编译器产生警告的代码。
    • 简化许可,见官方程序包/FreeRTOS/License/license.txt

    FreeRTOS+ 更新:

    • 使用目录名WolfSSL代替CyaSSL
    • 更新为最新的WolfSSL代码
    • 更新为最新的跟踪记录代码
    • 增加用于串流追踪(streaming trace)的FreeRTOS+追踪记录库。

           演示例程更新:

    • 增加Renesas RZ/T (Cortex-R)、PIC32MZ EF(带浮点硬件的PIC32)、PIC32MEC14xx、RX71M、RX113和RX231演示例程。
    • 整理拼写和编译器警告。

     

    FreeRTOS V8.2.2相对于FreeRTOS V8.2.1更新记录:

    FreeRTOSV8.2.2发行于2015.08.12,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载 ,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

     

     

    内核更新:

    • 增加英特尔IA32/x86 32位处理器移植层接口
    • 一般性维护
    • 增加PRIVILEGED_FUNCTION和PRIVILEGED_DATA宏,用于内存受保护的系统。
    • 在projdefs.h文件中增加errno定义,用于FreeRTOS+组件。
    • 删除当使用软件定时器时,避免tickless无限期等待的限制代码
    • 增加xTaskNotifyAndQueryFromISR(),这是API函数xTaskNotifyAndQuery()的带中断保护版本。
    • MSP430X移植层接口中增加额外的NOP指令,确保和硬件文档严格一致
    • Microblaze移植层接口:增加用于移植层接口优化任务的选项。
    • Microblaze移植层接口:之前在任务创建时任务继承异常使能状态。现在,只要Microblaze设计支持异常,则所有任务创建时都默认异常使能。
    • Windows移植层接口:增加额外的安全措施,确保正确的启动序列和线程切换时间。
    • Windows移植层接口:改善移植层接口实现代码,优化任务选择汇编代码。
    • 更新heap_4.c和heap_5.c,允许在64位处理器上使用。
    • 简化创建队列代码
    • 改善tickless空闲表现
    • 确保公共内核文件中的变量没有初始化为非零值。
    • 改正heap_4.c和heap_5.c中的xHeapStructSize计算

           演示例程更新:

    • 增加用于IA32/x86移植层接口的演示例程工程,使用Galileo硬件。
    • 增加MSP430FR5969演示例程(以前需要单独下载)
    • 增加FreeRTOS BSP,用于Xilinx SDK自动创建FreeRTOS应用程序。
    • 增加基于SAMV71 (ARM Cortex-M7)硬件的Atmel Studio / GCC工程
    • 更新Xilinx SDK工程,SDK使用2015.02月版本。
    • 移除Microblaze演示例程
    • 增加基于MSP43FR5969硬件的IAR和CCS演示例程。

           FreeRTOS+更新:

    • 更新FreeRTOS+跟踪记录库
    • 增加Reliance Edge源码和演示例程。Reliance Edge是一个故障保护事务性文件系统,特别适用于那些要求高可靠性场合的文件存储。
    • 增加configAPPLICATION_PROVIDES_cOutputBuffer配置宏,用于FreeRTOS+CLI使用者向一个固定内存地址放置输出缓存区。
    • 改善NetworkInterface.c文件,该文件用于FreeRTOS+UDP的Windows移植层接口。

     

    FreeRTOS V8.2.1相对于FreeRTOS V8.2.0更新记录:

    FreeRTOSV8.2.1发行于2015.03.24,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载 ,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

    内核更新:

    • 增加用户可定义的、灵活的本地存储设备
    • 增加API函数vTimerSetTimerID(),与API函数pvTimerGetTimerID()互补,允许将定时器的ID用作定时器局部存储器。
    • 修正一个在中断服务程序中使用队列有关的潜在问题。
    • 更新一些Xilinx Microblaze GCC有关的移植层接口代码
    • 增加ARM Cortex-M4F移植层接口,使用TI公司CCS编译器。
    • 增加ARM Cortex-M7 r0p1移植层接口,使用IAR、GCC和Keil编译器
    • 如果宏configUSE_CO_ROUTINES设置为0,将整个croutine.c文件代码屏蔽
    • 改变一些数据类型:将uint32_t改为size_t。为64位Windows移植层做准备。
    • 更新PIC32移植层接口,移除使用最新XC32编译器弃用的警告输出。

           演示例程更新:

    • 增加TI公司的MSP432微控制器(ARM Cortex-M4F内核)演示例程,使用IAR、Keil和CCS编译器。
    • 增加STM32F微控制器(ARM Cortex-M7)演示例程,使用IAR和Keil编译器。
    • 增加Atmel公司的SAMV71微处理器(ARM Cortex-M7)演示例程,使用IAR和Keil编译器。
    • 增加Microblaze演示例程,使用2014.04月Xilinx SDK版本、运行在KC705开发板平台。

     

    FreeRTOS V8.2.0相对于FreeRTOS V8.1.2更新记录:

    FreeRTOSV8.2.0发行于2015.01.16,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载 ,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

    内核更新:

    • 重要新特性! 任务通知。任务通知可以在大多数情况下代替二进制信号量、计数信号量、事件组,并且任务通知具有更快的运行速度和更少的RAM需求。
    • 增加一个新的头文件,必须包含在编译文件中。将过时的定义分离成单独一个新头文件叫FreeRTOS/Source/include/deprecated_definitions.h。注:这些过时的定义在一些上年头的演示例程中仍会使用。
    • 将xSemaphoreGiveFromISR()设计成一个函数,之前版本是宏定义,真正被调用的函数是xQueueGenericSendFromISR()。做成函数后,会增加编译后的代码大小,但是会提升性能。
    • 更改TCB分配方式,现在任务堆栈增长总是远离分配的TCB空间(这会改善堆栈溢出调试)。
    • 使用GCC、IAR和Keil编译器的Cortex-M4F移植层接口代码使用更对的内联(inline),这可以改善性能,但是以增加代码大小为代价。
    • 创建队列现在只需要调用一次pvPortMalloc()就可以分配队列结构体和队列项存储空间。
    • 引进新的临界区宏,用于读取系统节拍(tick)计数器
    • 在heap_4.c中引入configAPPLICATION_ALLOCATED_HEAP配置宏,允许应用程序提供堆数组空间。
    • 引入configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES配置宏,如果设置为1,则在列表和列表项结构体中包含一个已知值。打算使用这个已知值辅助调试。如果这个值被覆写,则很可能是应用程序代码改写了内核使用的RAM。
    • 所有Cortex-M移植层接口都包含configASSERT(),用于测试中断控制寄存器最低5位,用来防止在中断服务程序中调用taskENTER_CRITICAL(),现在,改为测试中断控制寄存器的最低8位。
    • 新增API函数uxTaskPriorityGetFromISR()。
    • Cortex-A5 GIC-less移植层接口不再向中断处理服务函数传递中断外设地址。
    • 修复一个问题。问题出现在FreeRTOS-MPU中,当删除任务时,会试图释放属于任务的堆栈,即使这个堆栈是使用静态方法分配的。
    • 任务状态信息格式化函数现在会使用空格填充任务名字,确保正确的列对齐,即使任务名字很长也会得体的对齐。
    • 更新FreeRTOS+跟踪记录库的版本为2.7.0

           演示例程更新:

    • 增加两个演示例程:IntSemTest和TaskNotify。前者演示并测试在中断中使用互斥量,后者测试任务通知。
    • 增加Atmel SAMA5D4(Cortex-A5 MPU)移植层接口和演示例程。
    • 增加Altera Cyclone V(Cortex-A9 MPU)演示例程。
    • 更新Zynq演示例程,使用2014.04月的Xilinx's SDK版本,并且将RTOS新特性增加到演示例程任务。
    • 更新Atmel SAM4E和SAM4S演示例程,包含很多额外的测试和演示任务。
    • 修复一个极端情况下出现的问题。该问题会导致Atmel SAM4L执行低功耗tickless代码。
    • 修改中断队列测试,使之更能容忍CPU负载变化。
    • 更新MSVC FreeRTOS模拟器演示例程,包含最新标准的测试和演示任务。
    • 更新MingW/Eclipse FreeRTOS模拟器演示例程,使之匹配FreeRTOS MSVC模拟器演示例程。
    • 更新所有使用FreeRTOS+跟踪代码的演示例程,使用最新的跟踪记录代码。

     

    FreeRTOS V8.1.2相对于FreeRTOS V8.1.1更新记录:

    FreeRTOSV8.1.2发行于2014.09.02,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载 ,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

     

    • 在个别移植层接口代码中,默认打开configUSE_PORT_OPTIMISED_TASK_SELECTION,以允许使用硬件特殊指令加快任务切换(比如Cortex-M硬件接口)。

     

    FreeRTOS V8.1.1相对于FreeRTOS V8.1.0更新记录:

    FreeRTOSV8.1.1发行于2014.08.29,推荐官方网站下载。考虑到官方网站的服务器在美国,下载速度较慢,下面给出CSDN下载地址:点击下载 ,下载需要1个资源分,请原谅博主需要资源分增加上传权限。

     

    • 按照大家要求,小幅修改V8.1.0代码,使得在中断服务程序中可以释放互斥类型信号量(带有优先级继承)。

     

     

     

     

    展开全文
  • Anroid app版本更新

    千次阅读 2018-06-03 10:40:17
    1.前言 Android app更新是app必须拥有的功能,上线之后,可以强制用户更新也可以提示用户有新版,之所以写这篇文章,是为了介绍app版本更新的思路,内容还是比较简单的。 有人可能会说,现在比较了流行Hotfix也...
  • Ubuntu系统版本更新

    千次阅读 2018-04-16 18:03:03
    上一篇我们更新了内核,本篇教大家如何进行版本号的迭代。 sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo do-release-upgrade -d //中间只要是停下来需要选择,一路选择Y即可...
  • iOS App版本更新

    千次阅读 2016-09-26 15:50:55
    版本更新的方式: 可选更新:弹框时有取消和更新两个按钮,用户可以选择取消按钮(增加新的功能,改善用户的体验等,这种更新不会影响软件的正常的使用) 强制更新:弹框时只有一个更新按钮,用户没得选择,必须更新...
  • Android 使用 DownloadManager 进行版本更新的完整方案

    万次阅读 多人点赞 2016-05-21 21:58:26
    在Android App都会有版本更新的功能,以前我们公司是用友盟SDK更新功能,自己服务器没有这样的功能。版本检测、Apk下载都是使用友盟。最近看到友盟的版本更新SDK文档:十月份更新功能将会停止服务器,建议开发者迁移...
  • app版本更新的四种实现方式

    万次阅读 2015-11-06 10:04:07
    版本更新大致分为四大类: 1.app负责单版本检测测与更新(自己实现版本更新); 2.通过苹果商店的自动更新机制进行自动更新(相当与自己不更新,靠苹果商店自己的自动更新机制更新,这个是苹果提倡的升级机制,但是app...
  • node和npm版本更新

    万次阅读 2017-11-11 11:21:19
    今天在安装ionic和cordova的时候,呃,没有成功安装,因为我的node版本和npm版本太低了,是去年安装的,于是我要更新它俩的版本。 // 首先查看其版本 node -v npm -v 然后更新至最新版本。 不知道为什么我的...
  • Android APK版本更新下载

    千次阅读 2017-05-17 20:48:18
    今天做了下APK版本更新的功能。其实关于APK版本更新相关的文章网上挺多的,功能实现上也并不难。基本思路就是讲当前APK的版本号和服务器上保存的最新APK包的版本号进行对比,如果当前版本小于最新版本,则进行下载...
  • AndroidStudio版本更新设置

    千次阅读 2016-07-29 10:56:42
    AndroidStudio默认会检测更新,在设置中: 如果不想自动更新就把勾去掉,勾选的话 后边的下拉箭头有选项,选择 Staable为更新稳定版,
  • Nodejs版本更新

    千次阅读 2019-08-15 17:11:15
    查看当前node的版本号 ...更新到最新稳定版 n stable n 常用的命令有: n 会列出所有安装的版本供你切换 n latest 安装最新版本 n stable 安装最新稳定版 n lts 安装最新长期支持版本 n rm [版...
  • Android提示版本更新----源码

    千次下载 热门讨论 2014-05-07 12:42:11
    博客《Android提示版本更新》对应的源码,博客地址:http://blog.csdn.net/harvic880925/article/details/25191159
  • cocospod 版本更新与更新到指定版本

    万次阅读 2017-02-13 10:47:08
    pod install --verbose --no-repo-update pod update --verbose --no-repo-update ...1.本地现有的cocopod的版本号是1.1.0.rc.2,想升级到最新版本 1、先切换gem源 gem sources --remove https
  • Cocoapods 版本更新

    千次阅读 2019-08-13 10:17:46
    1.切换gem源 gem sources --remove https://rubygems.org/gem source -a https://gems.ruby-china.org 查看是否切换成功 gem source -l 打印出 *** CURRENT SOURCES *** ...就说明切换成功,如果还是官...
  • Android 版本更新

    千次阅读 2019-01-25 21:00:28
    版本更新这一块涉及的知识点比较少,但也花了一天时间,仅做记录用,为了方便大家理解,我画了一张流程图。需求比较简单,以后可以根据产品需求适当更改。 以下版本更新工具类 /** * Created by minmin.shen ...
  • Unity 版本更新

    千次阅读 2017-10-12 20:14:57
    安卓的话 可以查看这章 内容很全面 http://www.cnblogs.com/kevonyang/p/5026690.html 使用方法:在需要的地方添加  VersionUpdater version = new VersionUpdater();  version.DownloadApkAsync("...
  • GIT 版本更新

    千次阅读 2018-03-23 17:16:33
    在使用yocto编译的时候回出现 git版本太低的情况,我们需要更新git版本不同的linux版本有不同命令 详细命令如下It is easiest to install Git on Linux using the preferred package manager of your Linux ...
  • android版本更新

    千次阅读 2016-09-13 13:18:59
    版本更新,估计现在大多数app都需要这样的功能,感觉以前写的比较繁琐,正好这次app需要添加这个功能,就想找个比较简单的方法实现; 众所周知,版本更新大致需要三步走: 第一步:获取当前版本号和服务器版本号 ...
  • IDEA 2018.3 版本更新总结

    千次阅读 2018-12-13 13:51:39
    文章目录IDEA 2018.3 版本更新总结1、关于Java 的更新1、支持Java 122、重复检查功能增强3、Java Stream API的改进4、冗余检测功能加强2、关于编辑器的更新1、支持多行TODO注释2、缩进的选择更加多样化3、关于版本...
  • adb工具版本更新

    万次阅读 2018-04-27 11:52:36
    使用abd连接开发板时,出现error: device offline。...仍旧失败,可能是adb版本太低,设备不支持。 https://blog.csdn.net/qq_33924155/article/details/79153000 原来的adb安装,环境变量配置如下: 新建Android...
  • 请使用升级版XVersionUpdateVersionUpdate是一个版本更新框架,帮助我们轻松实现版本更新功能。效果图 集成步骤1. bulid.gradle添加依赖库 compile 'com.androidkun:version_update:1.1.0'2. 调用下载方法并设置...
  • 软件的版本更新检查实现

    千次阅读 2004-10-31 20:18:00
    软件的自动更新检查 [Mental Studio]猛禽[Blog]还是在“PIA-MyPhotoGallery”中,为了能让使用者及时知道软件的更新版本发布,我增加了自动更新检查功能。鉴于这种功能具有很好的实用价值,所以写本文说明此功能的...
  • android版本更新功能

    万次阅读 多人点赞 2016-05-20 11:22:28
    1、检测是否有新版本 //访问服务器是否有新版本发布 UpdateVersionUtil.... //设置版本更新的回调接口 UpdateVersionUtil.setUpdateListener(new UpdateListener() { @Override public void onUpdateReturn

空空如也

1 2 3 4 5 ... 20
收藏数 122,829
精华内容 49,131
关键字:

版本更新