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

最新文章

  1. Android中,Context,什么是Context?
  2. 模型(Model)– ASP.NET MVC 4 系列
  3. max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
  4. Win7 64位 VS2013环境编译CGAL-4.7
  5. 黄聪:wordpress中PHP运行错最有效解决办法Fatal error: Out of memory (allocated 6029312)(转)
  6. innodb锁之间的兼容性判断
  7. POJ 1922
  8. Servlet中Service方法
  9. SQL 经典练习
  10. SVN与eclipse整合和利用、SVN与Apache综合
  11. Code First 启用迁移时出错 HRESULT:0x80131040
  12. MySQL/MariaDB中游标的使用
  13. Spring Boot 与 swagger 结合
  14. [cf1025D][区间dp]
  15. 洗礼灵魂,修炼python(64)--爬虫篇—re模块/正则表达式(2)
  16. HttpWebRequest post 提交 C#的WebBrowser操作frame如此简单 WebClient 提交
  17. StorageLevel
  18. 编译最新的SQLite 3.8.4.3为一个DLL
  19. P2607 [ZJOI2008]骑士
  20. 【vue】npm run mock & npm run dev 无法同时运行的解决

热门文章

  1. Why your Games are Unfinished, and What To Do About It (转)
  2. linux c数据库备份第一版
  3. NSEnumerator用法小结
  4. Linux下软件的安装
  5. wordpress 设置头像
  6. GNU DAEMON THREAD <1>
  7. BZOJ 3243 向量内积
  8. 45 Useful JavaScript Tips, Tricks and Best Practices(有用的JavaScript技巧,技巧和最佳实践)
  9. JS论坛地址备忘
  10. MongoDB入门简介