文档章节

app版本更新,及安装

新根
 新根
发布于 2015/08/17 16:42
字数 677
阅读 131
收藏 7

思路:

  1. 从服务器上拿到最新版本号,当前版本号。 比较版本号

  2. 拿到下载地址,进行下载(后台线程:例如 intentservice ,asyntask  , hanlder )

  3. 进行安装(   broadcastreciver上操作  )

 

String newAppUrl=“”; //app下载链接

private ProgressDialog progressdialog ;

 

 //比较版本,及发送更新信息
 public void compareVerson(){
         progressdialog=ProgressDialog.show(this,"版本信息", "正在检查版本...");
         progressdialog.setCancelable(true);
         new Thread(new Runnable() {
                    @Override
                     public void run() {
                            int newVerson=getNewVerson(  );      / /获取最新版本号,getNewVerson()没有贴出
                            int currentVerson=getVersonCode();
                            Looper.prepare();
                            Message msg=handler.obtainMessage();
                             if(newVerson>=currentVerson+1){  //存在最新版本
                                   msg.arg1=2;
                             }
                             else{ //无最新版本
                                   msg.arg1=0;
                              }
                               handler.sendMessage(msg);
                              Looper.loop();
                     }
           }).start(); 
 }

 

//获取版本号
 public int getVersonCode(){
            int versonCode;
            try {
                 PackageInfo packageInfo= getPackageManager().getPackageInfo(getPackageName(), 0);
                 versonCode= packageInfo.versionCode;
             } catch (Exception e) {
                   versonCode= 0 ;
                 e.printStackTrace();
              }
              return versonCode;
 }

 

private Handler handler = new Handler(new android.os.Handler.Callback() {
      public boolean handleMessage(Message msg) {

              switch (msg.arg1) {
                        case 0:  //对无最新版本的处理
                                    progressdialog.dismiss();
                                    Toast.makeText(LoginActivity.this,"暂无最新版本", Toast.LENGTH_SHORT).show();
                                     break;

                        case 2:

                                 progressdialog.dismiss();

                                 new AlertDialog.Builder(LoginActivity.this)
                                 .setTitle("在WIFI下进行更新?")
                                 .setPositiveButton("确定", new android.content.DialogInterface.OnClickListener() {
                                  @Override
                                      public void onClick(DialogInterface arg0, int arg1) {
      
                                        new MyAsynTask().execute(newAppUrl);
                                          arg0.dismiss();
                                   } })
                                  .setNegativeButton("取消", null)
                                  .create().show();

                                  break;

                       default:
                                   break;
                    }
                      if (progressdialog != null) {
                           if (progressdialog.isShowing()) {
                                    progressdialog.dismiss();
                             }
                         }
                    return false;
              }
 });

 

 

//在asytask中下载app
 public class MyAsynTask extends AsyncTask<String,Void,Boolean>{
         String weburi;
         //该方法在工作线程中被调用。在工作线程进行下载 操作
          protected Boolean doInBackground(String... arg0) {
                       weburi=arg0[0];
                 try {
                       downloadAPP(weburi);
                  } catch (Exception e) {
                        e.printStackTrace();
                        return false;
                 }
                      return  true ;
               }
                @Override
              protected void onPostExecute(Boolean result) {
                if(!result){
                   Toast.makeText(LoginActivity.this,"下载失败", Toast.LENGTH_SHORT).show();
                    }
                 super.onPostExecute(result);
               }
 }

   public static long myDownloadReference;      //myDownloadReference变量是当前请求的id

    //下载app,记录app所在路径
   public void downloadAPP(String uri){
            try {
               DownloadManager manager=(DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
               Request request=new Request(Uri.parse(uri));
               request.setTitle("ndfixedassets.apk");  //文件下载时显示的标题
               request.setNotificationVisibility(Request.VISIBILITY_VISIBLE); //下载完成后,notification会自动消失

               //运用在sdcard中专用文件

               request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,  "xxx.apk" );
               myDownloadReference=manager.enqueue(request);     //myDownloadReference变量是当前请求的id
 
 
              } catch (Exception e) {
                 e.printStackTrace();
           }
 }
 

 

public class InstallAppReciver extends BroadcastReceiver {
     //安装下载好后的app
     public void onReceive( final Context context, Intent intent) {
            long reference =intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if(myDownloadReference==reference){     //接受到下载完最新该app后的操作
                     AlertDialog dialog= new AlertDialog.Builder(context)
                                        .setTitle("安装新版本")
                                        .setMessage("覆盖旧版本")
                                        .setPositiveButton("确定",new android.content.DialogInterface.OnClickListener() {
                                             public void onClick(DialogInterface arg0, int arg1) {
                                                   install(context);
                                               } })
                                         .setNegativeButton("取消", null)
                                         .create();
                                       //设置dialog的类型确保,能在broadcastreceiver中正确弹出。
                                        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                                          dialog.show();
                   }
         }
     public void install(Context context){
            if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                   Intent installintent =new Intent();
                  installintent.setAction(Intent.ACTION_VIEW);

                  //在Boradcast中启动活动需要添加Intent.FLAG_ACTIVITY_NEW_TASK           

                  installintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


                 File file=new File(Environment.getExternalStoragePublicDirectory                 (Environment.DIRECTORY_DOWNLOADS), "xxx.apk");
                 installintent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
                 context.startActivity(installintent);


               }else{
                       Toast.makeText(context, "内存卡不存在或者不可用", Toast.LENGTH_SHORT).show();
               }
       }

}

 

 

 

 

//联网前先检查网络情况,在这里,就不贴出来

 

 <receiver
            android:name="com.nandafixedassets.broadcastreceiver.InstallAppReciver">
            <intent-filter
                android:priority="100">
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
            </intent-filter>
 </receiver>


 

<!-- 系统级别的对话框的权限 -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>      

<!-- 连接网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
<!-- 检查网络信息的权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <!-- 在sdcard中写入权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>   

© 著作权归作者所有

新根
粉丝 5
博文 28
码字总数 9431
作品 0
深圳
程序员
私信 提问
android app更新版本问题

具体是这样的:我在app的市场上已经上线了app,现在要更新很多东西,我就把app重新写了下,最近结尾了想测试下版本更新,我修改后的app把高版本的app下载下来,却无法覆盖安装,提示无法安装...

nihaohell
2017/05/09
206
1
Android实战之app版本更新升级全文章(一)

转自:http://blog.csdn.net/u013278099/article/details/52692008 尊重原创! 前言 本文将讲解app的升级与更新。一般而言用户使用App的时候升级提醒有两种方式获得: 一种是通过应用市场 获取...

qq_27489007
2017/04/14
0
0
苹果 TestFlight 应用

对于苹果app开发,官⽅方提供了了专⻔门的测试⼯工具TestFlight,⽤用于发布前⼤大批量量测试,⽅方便便开发者在上架到App Store之前修改存在的普遍性问题。 对于TestFlight使⽤用,可以参考...

宋映宏
2018/08/10
0
0
记一次app经AppStore更新后打开就crash的奇葩问题

在这里只是记录一下,问题还没有解决。 昨天app审核通过,今天在iPhone5c(系统iOS7.0.6)上测试AppStore更新app时,发现更新成功后打开app立即就闪退,再打开现象一样。删除app,装旧版本的...

yoyoso
2015/09/06
671
0
APP测试入门——常见功能测试点汇总

原文:https://mp.weixin.qq.com/s/PQlunbbfzvfOvjWZjshzlA 除去每个产品和版本不同的业务需求以及功能,针对于大多数APP的共同点和移动设备的特性,本文总结了一些APP功能测试中经常遇见,需...

junjunba2689
2018/05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦

全文共6706字,预计学习时长12分钟或更长 近日,《狮子王》热映,其逼真的外形,几乎可以以假乱真,让观众不禁大呼:awsl,这也太真实了吧! 实体模型、CGI动画、实景拍摄、VR等技术娴熟运用...

读芯术
25分钟前
1
0
C#经典面试题100道

1. .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34......

元歌
28分钟前
0
0
重磅!容器集群监控利器 阿里云Prometheus 正式免费公测

Prometheus 作为容器生态下集群监控的首选方案,是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native C...

阿里云云栖社区
29分钟前
1
0
LeetCode 160: 相交链表 Intersection of Two Linked Lists

爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点。 Write a program to find the node at which the intersection of two singly linked lists begins. 如下面的两个链...

iCodeBugs
31分钟前
1
0
hadoop yarn漏洞 8088端口进入挖矿病毒处理记录

早上发现服务器cpu使用异常 进程如图所示 按照挖矿病毒的套路 肯定是定时任务不停地执行脚本 遂查看定时任务 进入/var/spool/cron 查看定时任务 发现里面有一个root文件 定时任务每分钟执行一...

詹姆斯-高斯林
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部