提升升级 强制更新 Download

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);

    }

}

来自为知笔记(Wiz)

时间: 2024-11-05 18:03:32

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

友盟在线参数+自动更新升级SDK实现指定版本强制更新升级

项目上有这样的需求:对指定的版本要求强制升级,同时其它的版本可以选择性升级. 友盟的自动更新功能还是挺好用的,只不过对强制升级这块支持的还不到位. 不过友盟的开发人员也给出了勉强可行的方案: 使用友盟在线参数来控制哪些版本需要强制更新,哪些版本不需要 相关的内容如下: 1.在线参数配置: http://dev.umeng.com/analytics/android/advanced-integration-guide#3 2.强制更新官方代码: https://github.com/nxzhou

android产品研发(十四)-->App升级与更新

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android app中的轮训操作,讲解的内容主要包括:我们在App中使用轮训操作的情景,作用以及实现方式等.一般而言我们使用轮训操作都是通过定时任务的形式请求服务器并更新用户界面,轮训操作都有一定的使用生命周期,即在一定的页面中启动轮操作,然后在特定的情况下关闭轮训操作,这点需要我们尤为注意,我们还介绍了使用Timer和Handler实现轮训操作的实例,更多关于App中轮训操作的信息,可参考我的:android产品研发(十三)–>App轮训

友盟强制更新

公司项目选择了umeng的更新功能和,统计插件,而由于版本的管理,使得需要针对某些版本进行强制更新.比如上个版本出现了重大问题,必须进行版本升级才能修复,产品架构有了重大调整,数据结构发生了变化导致原先的app无法解析等等情况.但是查过umeng的产品文档,点击跳转地址为: 坑爹的umeng竟然没有强制更新功能,在目前的方法中无法实现强制更新.想想都开始打算做一个下载接口了,自己实现强制更新了... 再查了次umeng的替代方案,发现有一个这样方式,通过在后台设置在线参数,然后在app中对在线参

chrome浏览器避免因flash过期而强制更新

chrome浏览器避免因flash过期而强制更新 最近由于AdobeFlash漏洞影响全线Chrome浏览器,所有未更新flash的Chrome浏览器都无法使用flash播放器. 升级你怕了吗? 谷歌给的方法是更新chrome浏览器的flash版本,但是在天朝能连google网站的人少得可怜,更新太难,只能下一个最新版的chrome,但是我不能用最新的chrome,不然我之前惯用的json-handle插件就没法用了,只能想办法避免更新而强制使用了. 之前以为下个最新的Flash播放器能解决这个

关于angularjs中路由页面强制更新的问题

有这么一个问题,在页面内路由页面跳转时,第一次跳入路由页面时是正常的,但是第二次会记住第一次时的状态,有时候并不想这样,想强制更新这个路由页面. 有一种方式就是使用 ui-sref-opts功能,我试了,结果不好使,不知道是哪里出的问题: <a class="item" ui-sref="page1({id:1})" ui-sref-opts="{reload:true, notify: true}"> 链接1</a> 在

Chrome强制更新Flash导致视频广告屏蔽扩展失效的解决办法

本文章仅对旧版本的Chrome浏览器有效.(本人环境 Chrome V31) 最近Chrome强制更新Flash至18.0.0.209,是因为Flash爆出重大漏洞,会导致运行Flash的木马网页可以入侵用户系统. 不过新版本的Flash会导致大部分的视频广告屏蔽扩展失效,而无法播放视频.那如何解决呢? 我们可以通过利用旧版本的Flash文件来覆盖新版本,让Chrome运行旧版本的Flash插件. 不过这样会让你的电脑暴露在漏洞的危险之下,本人强烈推荐你安装一款屏蔽网页Flash的插件,仅在常用

IntelliJ强制更新Maven Dependencies

参考:http://blog.csdn.net/felcon/article/details/51980344 Intellj 自动载入Mave依赖的功能很好用,但有时候会碰到问题,导致pom文件修改却没有触发自动重新载入的动作,此时需要手动强制更新依赖. 如下: 手动删除Project Settings里面的Libraries内容: 在Maven Project的试图里clean一下,删除之前编译过的文件: 项目右键->Maven->Reimport(对应Maven项目的pom文件进行Rei

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

mvn clean install -e -U -e详细异常,-U强制更新 If your local repository is somehow mucked up for release jars as opposed to snapshots (-U and --update-snapshots only update snapshots), you can purge the local repo using the following: mvn dependency:purge-loc

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

调用更新接口返回字段: result =     { descr = ""; isupdate = 1;//是否更新 qzupdate = 0;//是否强制更新 updateurl = "http://www.baidu.com";//更新地址 versioncode = "2.0";//版本号 }; 根据获取的是否更新.强制更新以及新版本的序号进行判断 (1)强制更新:无论如何弹出提示框且只有一个选项,点击跳转更新 (2)普通更新:弹出提示框有