Activity和广播

/**
下载APK细节
1、点击升级后对话框不消失,再次点击时不能重复下载
2、下载过程中退出APP,下次进入应用后要重新下载(因为可能不完整)
3、下载过程中退出APP(或下载完成后退出),如果APK已经下载完毕,则下次进入应用后不再下载
4、如果下载的APK被清除了,要重新下载
5、断网后重新连接或切换网络后不受影响
 */
public class MainActivity extends Activity {
    private TextView textView;
    private DownloadCompleteReceiver receiver = null;
    private String url = "http://113.107.216.43/imtt.dd.qq.com/16891/BD5BA98958C0FEC9D88FB65BF5534A3B.apk?mkey=581c007d0e1baac8&f=8a5d&c=0&fsname=com.bcb_2.0.2_52.apk&csr=4d5s&p=.apk";
    private String fileName;
    private AlertDialog dialog;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
        setContentView(textView);
        fileName = "福利金融-" + Utiles.getVersionCode(this) + ".apk";
        textView.setText("文件名:" + fileName //
                + "\n文件路径:" + Utiles.getApkFile(fileName).getPath() //
                + "\n是否已下载过此版本的安装包:" + Utiles.getIsDownloaded(this, fileName)//
                + "\n是否已下载时退出了:" + Utiles.getIsFinishedWhenDownloading(this));
        showVersionDialog();
    }
    private void showVersionDialog() {
        AlertDialog.Builder ibuilder = new AlertDialog.Builder(this);
        ibuilder.setTitle("版本更新啦!");
        ibuilder.setMessage("优化用户界面,界面更好看\n修复所有已经的bug");
        ibuilder.setNegativeButton("退出应用", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                dialog = null;
                finish();
            }
        });
        ibuilder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                File file = Utiles.getApkFile(fileName);
                if (Utiles.getIsDownloaded(MainActivity.this, fileName)) {//已下载完毕
                    if (file == null || !file.exists()) {
                        Utiles.clearSP(MainActivity.this);//清空保存的两个数据
                        registerReceiver();//被删了,重新下载
                    } else Utiles.installApk(MainActivity.this, file);//否则,安装
                } else if (Utiles.getIsFinishedWhenDownloading(MainActivity.this)) {//上次在下载过程中退出了,下次进入应用时重新下载
                    registerReceiver();//重新下载
                } else if (file != null && file.exists()) {//正在下载
                    Toast.makeText(MainActivity.this, "正在下载,请稍后", Toast.LENGTH_SHORT).show();
                } else {//没下载过
                    registerReceiver();
                }
            }
        });
        dialog = ibuilder.create();
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
        dialog.show();
    }
    private void registerReceiver() {
        receiver = new DownloadCompleteReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);//下载完成的动作
        registerReceiver(receiver, intentFilter);
        Utiles.downLoadFile(MainActivity.this, url, fileName);//开始下载
    }
    class DownloadCompleteReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
                Toast.makeText(MainActivity.this, "下载完毕", Toast.LENGTH_SHORT).show();
                textView.append("下载完毕");
                Utiles.saveIsDownloaded(context, fileName);
                Utiles.installApk(context, Utiles.getApkFile(fileName));
                if (receiver != null) {
                    unregisterReceiver(receiver);
                    receiver = null;
                }
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (receiver != null) {//如果receiver不为空,说明正在下载APK包,即使应用退出了,也会继续下载
            unregisterReceiver(receiver);
            Utiles.saveIsFinishedWhenDownloading(this);//如果在下载过程中退出了,下次进入应用时重新下载
        }
    }
}

工具

public class Utiles {
    public static final String SP_NAME = "version";
    public static final String FILE_PATH = "/fljr/apk";
    /**返回下载的APK文件*/
    public static File getApkFile(String fileName) {
        String filePath = Environment.getExternalStorageDirectory().getPath() + FILE_PATH + File.separator + fileName;
        return new File(filePath);
    }
    /**安装指定的APK包*/
    public static void installApk(Context context, File apkFile) {
        Intent mIntent = new Intent(Intent.ACTION_VIEW);
        mIntent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(mIntent);
    }
    /**获取VersionCode*/
    public static int getVersionCode(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return 0;
        }
    }
     /**清空SP的数据*/
    public static void clearSP(Context context) {
        SharedPreferences.Editor editor = context.getSharedPreferences(SP_NAME, 0).edit();
        editor.clear();
        editor.commit();
    }
    //******************************************************************************************
    /**记录是否在下载过程中退出了,如果在下载过程中退出了,下次进入应用时重新下载*/
    public static void saveIsFinishedWhenDownloading(Context context) {
        SharedPreferences.Editor editor = context.getSharedPreferences(SP_NAME, 0).edit();
        editor.putBoolean("finish", true);
        editor.commit();
    }
    /**是否在下载过程中退出了*/
    public static boolean getIsFinishedWhenDownloading(Context context) {
        return context.getSharedPreferences(SP_NAME, 0).getBoolean("finish", false);
    }
    //******************************************************************************************
    /**记录是否已下载过指定版本的APK包*/
    public static void saveIsDownloaded(Context context, String fileName) {
        SharedPreferences.Editor editor = context.getSharedPreferences(SP_NAME, 0).edit();
        editor.putBoolean(fileName, true);
        editor.commit();
    }
    /**查看是否已下载过指定版本的APK包*/
    public static boolean getIsDownloaded(Context context, String fileName) {
        return context.getSharedPreferences(SP_NAME, 0).getBoolean(fileName, false);
    }
    /**下载文件*/
    public static void downLoadFile(Context mContext, String url, String fileName) {
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url))//下载路径
                .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)//显示方式。默认,下载过程中显示,下载完成后自动消失
                .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)//网络设置
                .setDestinationInExternalPublicDir(FILE_PATH, fileName);//文件下载路径
        ((DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
    }
}

提升升级 强制更新 Download的更多相关文章

  1. iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏

    1.使用CAReplicatorLayer制作等待动画 CALayer+CABasicAnimation可以制作很多简单的动画效果,之前的博客中介绍的“两个动画”,一个是利用一张渐变色图片+CABas ...

  2. 微信小程序热更新,小程序提示版本更新,版本迭代,强制更新,微信小程序版本迭代

    相信很多人在做小程序的时候都会有迭代每当版本迭代的时候之前老版本的一些方法或者显示就不够用了这就需要用到小程序的热更新.或者说是提示升级小程序版本 editionUpdate:function(){ ...

  3. Atitit.提升 升级类库框架后的api代码兼容性设计指南

    Atitit.提升 升级类库框架后的api代码兼容性设计指南 1. 增加api直接增加,版本号在注释上面增加1 2. 废弃api,使用主见@dep1 3. 修改api,1 4. 修改依赖import, ...

  4. WPF强制更新

    ,更新的时候选择最小版本号,就是强制更新

  5. maven缺少依赖包,强制更新命令

    mvn clean install -e -U -e详细异常,-U强制更新

  6. git 本地代码冲突解决,强制更新

    git reset soft,hard,mixed之区别深解 git reset --hard  强制更新覆盖本地   GIT reset命令,似乎让人很迷惑,以至于误解,误用.但是事实上不应该如此难 ...

  7. iOS实现应用更新及强制更新

    调用更新接口返回字段: result =     {             descr = "";             isupdate = 1;//是否更新         ...

  8. Maven项目强制更新,解决Failed to read artifact descriptor for xxx.jar问题

    导入的maven项目pom.xml现红叉 分析原因:在maven本地仓库中找不到相应的jar包. 解决方案:让maven强制更新依赖. 项目右击菜单,Maven -> Update Projec ...

  9. Git强制更新本地库和冲突解决

    1.You have not concluded your merge. (MERGE_HEAD exists) 本地有修改和提交,如何强制用远程的库更新.出现这种情况一般是git本地有commit, ...

随机推荐

  1. 安装 mysql server

    三个月前向公司申请了一台服务器单独给我用,作为部署我写的自动发布工具的服务器.同事不久前在我这台服务器上装了个数据库,今天上去查了一下,用不了,只有information_schema和test两个数 ...

  2. BZOJ 1263 整数划分

    Description 从文件中读入一个正整数\(n\).要求将\(n\)写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,\(n=13\),则当\(n\)表示为\(4+3+3+3\)(或\( ...

  3. 常见的HTTPS攻击方法

    0x00 背景 研究常见的https攻击方法 Beast crime breach,并针对https的特性提出一些安全部署https的建议. 针对于HTTPS的攻击,多存在于中间人攻击的环境中,主要是 ...

  4. Entity Framework OData filter inherit

    过滤继承对象 TPH 的情况 EF : return Task.FromResult<IQueryable<Parent>>( query.OfType<ChildA&g ...

  5. Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)

    之所以将打包这一特殊的内容作为数据通讯的第零节,是因为如果没有通过配置打包的一些信息,则没有办法将手机端应用和手表端应用连接起来,则无法继续进行接下来的数据通讯的开发. 以下依然只针对Eclipse平 ...

  6. 【算法Everyday】第一日 二叉查找树转双向链表

    算法题目链接:http://bbs.csdn.net/topics/350093707 题目 // 1.把二元查找树转变成排序的双向链表 // 题目: // 输入一棵二元查找树,将该二元查找树转换成一 ...

  7. BZOJ 1029 [JSOI2007]建筑抢修 已更新

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2748  Solved: 1213[Submit][Statu ...

  8. 【转】 Linux IIO子系统分析-1-概述

    原文网址:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20543672&id=2976189 最近稍微看了下LKML ...

  9. 数据结构(主席树):HDU 5654 xiaoxin and his watermelon candy

    Problem Description During his six grade summer vacation, xiaoxin got lots of watermelon candies fro ...

  10. 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12173  Solved: 4354[Submit][Sta ...