先梳理一下流程:判断版本号——>大于当前版本号更新——》弹出框询问是否需要更新(确定更新)——》使用系统DownloadManager进行下载——》下载完成之后跳转到安装页面——》安装完成之后卸载
后面有完整代码
1、判断版本号
获取最新的版本信息
/**
* 获取系统版本号
* */
public String getAppVersionCode(Context context) {
int versioncode = 0;
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
// versionName = pi.versionName;
versioncode = pi.versionCode;
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versioncode + "";
}
然后和接口返回的versioncode进行比较,如果比接口返回的code小的话就进行更新操作,否则不需要更新
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main10);
if (Integer.parseInt(getAppVersionCode(this))>1){
ShowDialog();
}
}
2、弹框询问是否需要更新
发现有新版本的时候可以弹框提示是否更新,在这一步你可以定制精美的弹出框,把下载的逻辑写在确定按钮的监听里面就行
/**
* 弹框询问是否更新版本
* */
private void ShowDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("有新版本");
builder.setMessage("更新内容");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
getAPK();
}
}); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
3、使用系统DownloadManager进行下载
下载的方式是使用系统DownloadManager实现的,很简便
/**
* 下载apk
* */
public void getAPK(){
DownloadManager mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
String apkUrl = "https://qd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk";
Uri resource = Uri.parse(apkUrl);
DownloadManager.Request request=new DownloadManager.Request(resource);
//下载的本地路径,表示设置下载地址为SD卡的Download文件夹,文件名为mobileqq_android.apk。
request.setDestinationInExternalPublicDir("Download", "mobileqq_android.apk");
//start 一些非必要的设置
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(true);
request.setTitle("");
//end 一些非必要的设置
mDownloadManager.enqueue(request);
}
下载过程会在消息通知栏查看进度,到这里就实现了更新apk版本了,点击可以进行安装程序,但是我们想下载完直接跳转到安装页面,接着往下
4、下载完成之后跳转安装页面
我们需要定义一个广播
/**
* Created by Forrest.
* User: Administrator
* Date: 2020/12/28
* Description:
*/
public class DownLoadCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())){
long id=intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,-1);
Toast.makeText(context, "下载任务已经完成!", Toast.LENGTH_SHORT).show();
DownloadManager.Query query=new DownloadManager.Query();
DownloadManager dm= (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
query.setFilterById(id);
Cursor c=dm.query(query);
if (c!=null){
try {
if (c.moveToFirst()){
String filename=c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
int status=c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
if (status==DownloadManager.STATUS_SUCCESSFUL){
Uri uri=Uri.fromFile(new File(filename));
if (uri!=null){
Intent intent1=new Intent(Intent.ACTION_VIEW);
intent1.setDataAndType(uri,"application/vnd.android.package-archive");
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
}
}
}catch (Exception e){
e.printStackTrace();
return;
}finally {
c.close();
}
}
}
}
}
然后在清单文件中注册
<application
android:name="com.dhy.health.app.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
//......
<receiver android:name="com.dhy.health.utils.DownLoadCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
</intent-filter>
</receiver>
//......
</application>
完成之后就会下载完成之后自动跳转到安装页面,你只需要点击安装就可以了,安装成功后选择完成或者打开,不管点击那个都会询问是否删除下载的安装包,删除掉就ok了,也不占用内存空间
下面把完整代码贴出来
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import com.dhy.health.svndemo.R;
public class Main10Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main10);
if (Integer.parseInt(getAppVersionCode(this))>1){
ShowDialog();
}
}
/**
* 获取系统版本号
* */
public String getAppVersionCode(Context context) {
int versioncode = 0;
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
// versionName = pi.versionName;
versioncode = pi.versionCode;
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versioncode + "";
}
/**
* 获取系统版本名称
* */
public String getAppVersionName(Context context) {
String versionName=null;
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
versionName = pi.versionName;
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versionName;
}
/**
* 弹框询问是否更新版本
* */
private void ShowDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("有新版本");
builder.setMessage("更新内容");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
getAPK();
}
}); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
/**
* 下载apk
* */
public void getAPK(){
DownloadManager mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
String apkUrl = "https://qd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk";
Uri resource = Uri.parse(apkUrl);
DownloadManager.Request request=new DownloadManager.Request(resource);
//下载的本地路径,表示设置下载地址为SD卡的Download文件夹,文件名为mobileqq_android.apk。
request.setDestinationInExternalPublicDir("Download", "mobileqq_android.apk");
//start 一些非必要的设置
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(true);
request.setTitle("");
//end 一些非必要的设置
mDownloadManager.enqueue(request);
}
}