使用系统DownloadManager实现自动更新

先梳理一下流程:判断版本号——>大于当前版本号更新——》弹出框询问是否需要更新(确定更新)——》使用系统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);
    }
}

猜你喜欢

转载自blog.csdn.net/lanrenxiaowen/article/details/111832274