android+后台下载notification,Android APP更新_后台下载、自动安装

该博客介绍了一个自定义的下载服务类,用于处理应用更新的下载流程。当系统下载管理器被禁用时,会提示用户开启。然后使用DownloadManager进行文件下载,并在下载完成后执行安装APK的逻辑,兼容Android 7.0以上的版本。同时,提供了一个版本号比较的方法compareVersion,用于比较应用的当前版本和最新版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前看了好多博客,拿过来用了用,都不是特别理想

自己手撸一个得了,拿去直接用就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;

}

}

调用:

检测应用的当前版本号。与服务端最新版本号进行比较。

a22ab3ca18e0f7f8e1c282cd7b2e3e60.png

xie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值