Android(安卓)APP更新_后台下载、自动安装
16lz
2021-01-24
之前看了好多博客,拿过来用了用,都不是特别理想
自己手撸一个得了,拿去直接用就OK
public class UpdateService { private DownloadManager mDownloadManager; private Context mContext; private long downloadId; private String apkName; public UpdateService() { } public UpdateService(Context context) { mContext = context; } public void download(String url, String name) { final String packageName = "com.android.providers.downloads"; int state = mContext.getPackageManager().getApplicationEnabledSetting(packageName); //检测下载管理器是否被禁用 if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext).setTitle("温馨提示").setMessage ("系统下载管理器被禁止,需手动打开").setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); try { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + packageName)); mContext.startActivity(intent); } catch (ActivityNotFoundException e) { Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); mContext.startActivity(intent); } } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } else { //正常下载流程 apkName = name; DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setAllowedOverRoaming(false); //通知栏显示 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setTitle(AppUtil.getAppName(mContext)); request.setDescription("正在下载中..."); request.setVisibleInDownloadsUi(true); //设置下载的路径 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, apkName); //获取DownloadManager mDownloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); downloadId = mDownloadManager.enqueue(request); mContext.registerReceiver(mReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); } } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { checkStatus(); } }; /** * 检查下载状态 */ private void checkStatus() { DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); Cursor cursor = mDownloadManager.query(query); if (cursor.moveToFirst()) { int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); switch (status) { //下载暂停 case DownloadManager.STATUS_PAUSED: break; //下载延迟 case DownloadManager.STATUS_PENDING: break; //正在下载 case DownloadManager.STATUS_RUNNING: break; //下载完成 case DownloadManager.STATUS_SUCCESSFUL: installAPK(); break; //下载失败 case DownloadManager.STATUS_FAILED: Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show(); break; } } cursor.close(); } /** * 7.0兼容 */ private void installAPK() { File apkFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), apkName); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Uri apkUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".provider", apkFile); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); } mContext.startActivity(intent); }}
版本对比
/** * 版本号比较 * * @param version1 * @param version2 * @return */ public static int compareVersion(String version1, String version2) { if (version1.equals(version2)) { return 0; } String[] version1Array = version1.split("\\."); String[] version2Array = version2.split("\\."); Log.d("HomePageActivity", "version1Array=="+version1Array.length); Log.d("HomePageActivity", "version2Array=="+version2Array.length); int index = 0; // 获取最小长度值 int minLen = Math.min(version1Array.length, version2Array.length); int diff = 0; // 循环判断每位的大小 Log.d("HomePageActivity", "verTag2=2222="+version1Array[index]); while (index < minLen && (diff = Integer.parseInt(version1Array[index]) - Integer.parseInt(version2Array[index])) == 0) { index++; } if (diff == 0) { // 如果位数不一致,比较多余位数 for (int i = index; i < version1Array.length; i++) { if (Integer.parseInt(version1Array[i]) > 0) { return 1; } } for (int i = index; i < version2Array.length; i++) { if (Integer.parseInt(version2Array[i]) > 0) { return -1; } } return 0; } else { return diff > 0 ? 1 : -1; } }
调用:
检测应用的当前版本号。与服务端最新版本号进行比较。
xie
更多相关文章
- android HTTPS 访问 安全认证
- Android(安卓)studio 统一管理依赖版本号
- android 系统中修改系统的版本号
- Android高效的应用程序开发工具集1---ant构建一个简单的Android
- 使用 Xcode 和 Android Studio 管理 iOS 和 Android 项目版本
- Android小项目之三 splash界面
- [置顶] ADT版本号超过17后,所遇到的问题,如导入项目没有Android De