文档章节

Android实现版本更新提示

会飞柚子
 会飞柚子
发布于 2016/02/24 11:42
字数 1299
阅读 27
收藏 0

步骤:

1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。

2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

Android提示版本更新的实现

Android提示版本更新的实现

Android提示版本更新的实现

Android提示版本更新的实现

?

1
2
3
4
5
6
7
8
9
10
11
12
获取当前程序的版本号:
 
1 . /* 
2. * 获取当前程序的版本号  
3. */  
4 . private String getVersionName()  throws Exception{  
5 .     //获取packagemanager的实例    
6 .    PackageManager packageManager = getPackageManager();  
7 .     //getPackageName()是你当前类的包名,0代表是获取版本信息   
8 .    PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),  0 );  
9 .     return packInfo.versionName;   
10 .}

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
获取服务器端的版本号:
1 . /* 
2. * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号) 
3. */  
4 . public static UpdataInfo getUpdataInfo(InputStream is)  throws Exception{  
5 .    XmlPullParser  parser = Xml.newPullParser();    
6 .    parser.setInput(is,  "utf-8" ); //设置解析的数据源    
7 .     int type = parser.getEventType();  
8 .    UpdataInfo info =  new UpdataInfo(); //实体   
9 .     while (type != XmlPullParser.END_DOCUMENT ){  
10 .         switch (type) {  
11 .         case XmlPullParser.START_TAG:  
12 .             if ( "version" .equals(parser.getName())){  
13 .                info.setVersion(parser.nextText());  //获取版本号   
14 .            } else if ( "url" .equals(parser.getName())){  
15 .                info.setUrl(parser.nextText());  //获取要升级的APK文件   
16 .            } else if ( "description" .equals(parser.getName())){  
17 .                info.setDescription(parser.nextText());  //获取该文件的信息   
18 .            }  
19 .             break ;  
20 .        }  
21 .        type = parser.next();  
22 .    }  
23 .     return info;  
24 .}

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
从服务器下载apk:
1 . public static File getFileFromServer(String path, ProgressDialog pd)  throws Exception{  
2 .     //如果相等的话表示当前的sdcard挂载在手机上并且是可用的   
3 .     if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
4 .        URL url =  new URL(path);  
5 .        HttpURLConnection conn =  (HttpURLConnection) url.openConnection();  
6 .        conn.setConnectTimeout( 5000 );  
7 .         //获取到文件的大小    
8 .        pd.setMax(conn.getContentLength());  
9 .        InputStream is = conn.getInputStream();  
10 .        File file =  new File(Environment.getExternalStorageDirectory(),  "updata.apk" );  
11 .        FileOutputStream fos =  new FileOutputStream(file);  
12 .        BufferedInputStream bis =  new BufferedInputStream(is);  
13 .         byte [] buffer =  new byte [ 1024 ];  
14 .         int len ;  
15 .         int total= 0 ;  
16 .         while ((len =bis.read(buffer))!=- 1 ){  
17 .            fos.write(buffer,  0 , len);  
18 .            total+= len;  
19 .             //获取当前下载量   
20 .            pd.setProgress(total);  
21 .        }  
22 .        fos.close();  
23 .        bis.close();  
24 .        is.close();  
25 .         return file;  
26 .    }  
27 .     else {  
28 .         return null ;  
29 .    }  
30 .}

匹配、下载、自动安装:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
  * 从服务器获取xml解析并进行比对版本号 
  */ 
public class CheckVersionTask  implements Runnable{ 
   
     public void run() { 
         try
             //从资源文件获取服务器 地址   
             String path = getResources().getString(R.string.serverurl); 
             //包装成url的对象   
             URL url =  new URL(path); 
             HttpURLConnection conn =  (HttpURLConnection) url.openConnection();  
             conn.setConnectTimeout( 5000 ); 
             InputStream is =conn.getInputStream();  
             info =  UpdataInfoParser.getUpdataInfo(is); 
               
             if (info.getVersion().equals(versionname)){ 
                 Log.i(TAG, "版本号相同无需升级" ); 
                 LoginMain(); 
             } else
                 Log.i(TAG, "版本号不同 ,提示用户升级 " ); 
                 Message msg =  new Message(); 
                 msg.what = UPDATA_CLIENT; 
                 handler.sendMessage(msg); 
            
         }  catch (Exception e) { 
             // 待处理   
             Message msg =  new Message(); 
             msg.what = GET_UNDATAINFO_ERROR; 
             handler.sendMessage(msg); 
             e.printStackTrace(); 
         }  
    
}  

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Handler handler =  new Handler(){     
     @Override 
     public void handleMessage(Message msg) { 
         // TODO Auto-generated method stub  
         super .handleMessage(msg); 
         switch (msg.what) { 
         case UPDATA_CLIENT: 
             //对话框通知用户升级程序   
             showUpdataDialog(); 
             break
             case GET_UNDATAINFO_ERROR: 
                 //服务器超时   
                 Toast.makeText(getApplicationContext(),  "获取服务器更新信息失败" ,  1 ).show(); 
                 LoginMain(); 
             break ;   
             case DOWN_ERROR: 
                 //下载apk失败  
                 Toast.makeText(getApplicationContext(),  "下载新版本失败" ,  1 ).show(); 
                 LoginMain(); 
             break ;   
            
    
};

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
 
  * 弹出对话框通知用户更新程序 
 
  * 弹出对话框的步骤:
  *  1.创建alertDialog的builder.  
  *  2.要给builder设置属性, 对话框的内容,样式,按钮
  *  3.通过builder 创建一个对话框
  *  4.对话框show()出来  
  */ 
protected void showUpdataDialog() { 
     AlertDialog.Builder builer =  new Builder( this ) ;  
     builer.setTitle( "版本升级" ); 
     builer.setMessage(info.getDescription()); 
     //当点确定按钮时从服务器上下载 新的apk 然后安装   
     builer.setPositiveButton( "确定" ,  new OnClickListener() { 
     public void onClick(DialogInterface dialog,  int which) { 
             Log.i(TAG, "下载apk,更新" ); 
             downLoadApk(); 
         }    
     }); 
     //当点取消按钮时进行登录  
     builer.setNegativeButton( "取消" ,  new OnClickListener() { 
         public void onClick(DialogInterface dialog,  int which) { 
             // TODO Auto-generated method stub  
             LoginMain(); 
        
     }); 
     AlertDialog dialog = builer.create(); 
     dialog.show(); 
}

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
  * 从服务器中下载APK
  */ 
protected void downLoadApk() { 
     final ProgressDialog pd;     //进度条对话框  
     pd =  new  ProgressDialog( this ); 
     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     pd.setMessage( "正在下载更新" ); 
     pd.show(); 
     new Thread(){ 
         @Override 
         public void run() { 
             try
                 File file = DownLoadManager.getFileFromServer(info.getUrl(), pd); 
                 sleep( 3000 ); 
                 installApk(file); 
                 pd.dismiss();  //结束掉进度条对话框  
             }  catch (Exception e) { 
                 Message msg =  new Message(); 
                 msg.what = DOWN_ERROR; 
                 handler.sendMessage(msg); 
                 e.printStackTrace(); 
            
         }}.start(); 
}

?

1
2
3
4
5
6
7
8
9
//安装apk   
protected void installApk(File file) { 
     Intent intent =  new Intent(); 
     //执行动作  
     intent.setAction(Intent.ACTION_VIEW); 
     //执行的数据类型  
     intent.setDataAndType(Uri.fromFile(file),  "application/vnd.Android.package-archive" ); //编者按:此处Android应为android,否则造成安装不了   
     startActivity(intent); 
}

?

1
2
3
4
5
6
7
8
9
/*
  * 进入程序的主界面
  */ 
private void LoginMain(){ 
     Intent intent =  new Intent( this ,MainActivity. class ); 
     startActivity(intent); 
     //结束掉当前的activity   
     this .finish(); 
}

二、参考后使用情况:
1.可以下载apk,但安装失败:

1)以为配置文件中需定义了android.permission.INSTALL_PACKAGES,其实不需;

2)以为是要在执行安装的activity中配置

?

1
2
3
4
< intent-filter >
         < action android:name = "android.intent.action.VIEW" />
         < category android:name = "android.intent.category.DEFAULT" />
</ intent-filter >

,其实不是; 

3)代码中application/vnd.Android.package-archive有一个字母A大写了,改小写后解决;

本文转载自:

会飞柚子
粉丝 0
博文 34
码字总数 3972
作品 0
深圳
程序员
私信 提问
AndroidStudio、gradle、buildToolsVersion关系

使用AndroidStudio 开发也已经2年了,每次gradle 或者studio 有推荐更新后,项目重新sync后都会报错,提示更新相应的其他版本,比如AndroidStudio、gradle、buildToolsVersion版本; 先来说说...

SuShine
2017/11/07
0
0
Android 中会出现的问题:This Android SDK requires Andro...

windows 下面安装Android虚拟机,有时候选择更新SDK后,在Eclipse preference里指向androidsdkwindowsx86时。会出现诸如This AndroidSDK requires Android Developer Toolkit version 10.0.0......

才沐木
2012/07/17
0
0
Android Q 将限制开发者使用旧版本 API,不听话就警告

谷歌在 Android Pie 中实现了一项功能,该功能将警告用户应用程序是针对较旧的 Android API 版本而构建的,而据 XDA 报道,在 Android Q 中,该规定将更为严格,它将最低允许目标版本从 API ...

h4cd
2018/09/05
3K
12
Android Studio 1.3 Preview 1 发布

Android Studio 1.3 Preview 1 发布,此版本现已提供在 canary 频道。 此版本包括大量新特性: 全新 Allocation Tracker 全新Heap dump Viewer Android M 预览数据绑定支持 支持在项目结构对...

oschina
2015/05/31
5.7K
15
Android Studio 1.1.0 稳定版发布更新

Android Studio 1.1.0 稳定版已经发布,现已 Help->Check for update... 更新到 1.1.0 Android Studio 1.1.0 现已提供下载:http://tools.android.com/download/studio 我从上一个稳定版版本......

爱特网络
2015/02/19
36.9K
28

没有更多内容

加载失败,请刷新页面

加载更多

如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
22分钟前
0
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
30分钟前
1
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
38分钟前
0
0
想说再见不容易,win7最新市占率依然超36%

微软正在通过努力让Windows 7用户升级至Windows 10,不过从目前的市占率来看,他们还是要加把劲了。 据最新的市场份额看,Windows 10在本月的市场份额有所提升,从43.62%增长到44.10%。另一...

linuxCool
50分钟前
4
0
SQL的优化

对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建了索引。 应尽量避...

咸鱼-李y
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部