点击android 版本_连续点击android版本 - CSDN
  • [java] view plain copy long[] mHits = new long[3];   //三击事件   public void click(View view){  ... //srcPos 从源数组的那个位置开始拷贝.... //dst 目标数组 

    [java] view plain copy
    1. long[] mHits = new long[3];  
    2.     //三击事件  
    3.     public void click(View view){  
    4.         //src 拷贝的源数组  
    5.         //srcPos 从源数组的那个位置开始拷贝.  
    6.         //dst 目标数组  
    7.         //dstPos 从目标数组的那个位子开始写数据  
    8.         //length 拷贝的元素的个数  
    9.       System.arraycopy(mHits, 1, mHits, 0, mHits.length-1);  
    10.       mHits[mHits.length-1] = SystemClock.uptimeMillis();  
    11.       if (mHits[0] >= (SystemClock.uptimeMillis()-500)) {  
    12.          Toast.makeText(this"恭喜你,3次点击了。"0).show();  
    13.       }  
    14.     }  


    谷歌的实现跟网上常见的还是很不同的

    展开全文
  • 如果连续点击Android 版本。有时会弹出有一个大字母的的窗口。  遇到这种情况,换别的项目连续点击。一般就能打开。  祝工作顺利。

      如果连续点击Android 版本。有时会弹出有一个大字母的的窗口。

      遇到这种情况,换别的项目连续点击。一般就能打开。

      祝工作顺利。

    展开全文
  • import android.app.Activity; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Overrid
    <pre name="code" class="java">import android.app.Activity;
    import android.os.Bundle;
    import android.os.SystemClock;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        private long[] mHits = new long[3];
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        //自定义双击事件
        public void Click(View view) {
    // arraycopy 参数
    //		src 拷贝的原数组
    //		srcPos 拷贝原数组从那个地方开始
    //		dst 拷贝到那个数组
    //		dstPos 从那个地方开始拷贝
    //		length 拷贝数组元素的个数
    // (把数组mHits[] pos = 1的时间赋值给 pos = 0,把数组pos = 2的时间赋值给 pos = 1,数组mHits[] pos = 3则为系统当前时间)
            System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
            mHits[mHits.length - 1] = SystemClock.uptimeMillis();
            if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
                Toast.makeText(getApplicationContext(), mHits.length + "次点击事件", 0).show();
    
            }
    
        }
    
    }
    


    
    if (mHits[0] >= (mHits[mHits.length - 1] - 500)){}:这个用来判断是否是3击事件 ,判断数组中pos=2的点击事件的时间与数组中pos=0的点击事件的时间差值是否小于500;若小于500认为是3击事件,弹出Toast语句;否则不为3击事件。
    
    展开全文
  • Android提示版本更新

    2014-05-07 12:47:16
    前言:

    前言:在软件开发的尾声应该都会遇到这个问题,还好网上资料很多,所以基本不费什么力气就搞定了,现记录于下。这里用的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 不胜感激。

    展开全文
  • Android版本更新知识(检测、升级)总结 本文对Android版本更新的知识做全面的总结,主要包括开发中版本的设置,如何检测本程序的版本,版本的更新判断和显示,新版本程序的安装。一.版本的基础知识 版本控制的...
  • Android 版本检测更新

    2016-07-01 09:12:06
    Android版本检测更新是每个应用升级所不可少的,以前早就做过一些,一直没有时间与大家分享,现在就跟大家来分享一下我做的版本检测更新吧。先上图 点击更新之后的 可能有人会问为啥点击更新提示框不消失啊,...
  • Android发行版本 Android 各代版本 Logo Android在正式发行之前,最开始拥有两个内部测试版本,并且以著名的机器人名称来对其进行命名,它们分别是:阿童木(AndroidBeta),发条机器人(Android 1.0)。后来...
  • Flutter之Android SDK版本与External Libraries中的Android API版本不一致问题描述解决办法 问题描述 先看问题图片: Android SDK verson 是 29.0.1,External Libraries 中Android API 版本是25。 解决办法 在项目...
  • 每当写完代码后,若要返回上一个版本信息,我们可以利用android studio自带的版本还原VCS来回退上一个版本信息具体做法如下所示:1.保存提交的代码:点击导航栏VCS,点击Commit changes,将文件上传,或用git push至...
  • 步骤: 1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。...3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面
  • 不知不觉,Android系统已经发展了10之久,按照谷歌的命名风格,每个安卓版本都会以字母的顺序来进行命名,并且它们都有一个甜品代号(除A、B外),从最初的纸杯蛋糕(cupcake)到现在的奥利奥(Oreo)以及最新的beta...
  • Android studio是做安卓开发使用得比较多的编程软件,如果要查看自己电脑安装的是哪个版本,首先在电脑上找到Android studio的快捷方式。如图所示,我们在电脑上点击【开始】,找到as的快捷方式并打开。 如何查看...
  • Android由来: Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l’Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L’ève future)中。他将外表像人的机器起名为AndroidAndroid的Logo是由伊琳娜...
  • android版本更新功能

    2018-07-05 13:41:42
    1、检测是否有新版本 //访问服务器是否有新版本发布 UpdateVersionUtil.checkVersion(MainActivity.this); //设置版本更新的回调接口 UpdateVersionUtil.setUpdateListener(new UpdateListener() { @...
  • 点击给我投票前言前段时间android L(android 5.0)出来了,界面上做了一些改动,主要是添加了若干动画和一些新的控件,相信大家对view的点击效果-水波纹很有印象吧,点击一个view,然后一个水波纹就会从点击处扩散...
  • 本文主要介绍Android系统各个版本的新特性,不定时更新ing...
  • Android 1.x, Android 2.x,Android 3.x,Android 4.x,Android 5.x,Android 6.x相关更新的内容文章主要收集的是Android发展信息和各版本特性,本文内容比较平淡,较少涉及技术的描述,Android版本技术更新的文章
  • Android版本之间的区别

    2018-06-04 10:50:28
    从2009年5月开始,Android操作系统改用甜点来作为版本代号,这些版本按照大写字母的顺序来进行命名。 以下表格展示所有安卓版本以及发布时间和代号。 版本号 发布日 代号 Android 1.0 2008年9月23日 ...
  • 初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这里将常用的 Android Studio 常用的版本管理总结下.
1 2 3 4 5 ... 20
收藏数 155,798
精华内容 62,319
关键字:

点击android 版本