android使用第三方平台(蒲公英)和DownloadManager实现APP自动更新

对于安卓用户来说,手机应用更新是很频繁的,我们不能在每一次升级版本的时候,都让用户再去应用市场上重新下载一遍,这样是很不友好的。因此,在app里实现自动更新的功能,就显得很有必要了。
今天,就来聊一下,如何使用蒲公英第三方平台和DownLoadManager来实现app自动更新的功能。从以下三个方面来说明:**

  1. app自动更新流程阐述

  2. 如何集成第三方平台(蒲公英)

  3. 如何使用系统自带类DownloadManager来实现下载

    一.app自动更新的流程:

    android使用第三方平台(蒲公英)和DownloadManager实现APP自动更新_第1张图片

二.如何集成第三方平台(蒲公英)

1.如何创建蒲公英的账号和应用,大家自行去蒲公英的官网操作,在这里就不过多说明。

2.导入依赖

compile 'com.pgyersdk:sdk:2.5.6'

3.添加权限:在AndroidManifest.xml中添加

android:name="android.permission.ACCESS_NETWORK_STATE" /> 
android:name="android.permission.INTERNET" /> 
android:name="android.permission.READ_PHONE_STATE" /> 
android:name="android.permission.ACCESS_WIFI_STATE" /> 
android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
android:name="android.permission.RECORD_AUDIO" /> 

4.在AndroidManifest.xml中添加蒲公英提供的App key

android:name="PGYER_APPID"
           android:value="蒲公英key" > 
</meta-data>

5.在蒲公英上传你开发的app,获取你的蒲公英app key,将AndroidManifest.xml中的value值换成自己的蒲公英key
android使用第三方平台(蒲公英)和DownloadManager实现APP自动更新_第2张图片

三.如何使用系统自带类DownloadManager来实现下载

1.DownloadManager简单介绍
DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request。DownloadManager.Request用来请求一个下载,DownloadManager.Query用来查询下载信息。
2.新建ApkDownloadReceiver广播类来监听DownloadManager下载任务的状态,通过downloadId来查找下载的任务,如果下载完成,就去安装apk,如果下载失败,则弹出吐司提示。

public class ApkDownloadReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent data) {
        //获取下载任务的downloadId
        long downloadId = data.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
        if (downloadId == PrefUtils.getApkDownloadId()) {
            DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
            //通过downloadId来查找下载的任务
            Cursor query = downloadManager.query(new DownloadManager.Query().setFilterById(downloadId));
            try {
                if (query.moveToFirst()) {
                    //获取下载任务的状态
                    int status = query.getInt(query.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:
                            //下载完成安装APK
                            installApk(context,query);
                            break;
                        //下载失败
                        case DownloadManager.STATUS_FAILED:
                            //弹出提示
                            Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show();
                            break;
                    }

                }
            } finally {
                query.close();
            }
        }
    }

    private void installApk(Context context,Cursor query) {
        String apkPath = query.getString(query.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
        Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, Uri.fromFile(new File(apkPath)));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

3.在AndroidManifest.xml监听下载广播完成的动作

 
    android:name="com.example.marvinma.pgyerupdatedemo.ApkDownloadReceiver">
        
            android:name="android.intent.action.DOWNLOAD_COMPLETE" />
        </intent-filter>
    >

4.在MainActivity onStart方法中去注册蒲公英,在onDestroy方法中去反注册。

@Override
    protected void onStart() {
        super.onStart();
        //获取DownloadManagerDownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        if (PrefUtils.getApkDownloadId() != -1) {
            //通过保存的downloadId来获取索引
            Cursor query = downloadManager.query(new DownloadManager.Query().
                    setFilterById(PrefUtils.getApkDownloadId()));
            try {
                if (query.moveToFirst()) {
                    //获取下载任务的状态
                    int status = query.getInt(query.getColumnIndex(DownloadManager.COLUMN_STATUS));
                    //如果已经在下载中,就返回,不再去下载
                    if (status == DownloadManager.STATUS_RUNNING) {
                        return;
                    } else {
                        //如果是其他状态,就将之前的下载记录移除
                        downloadManager.remove(query.getInt(query.getColumnIndex(DownloadManager.COLUMN_ID)));
                        PrefUtils.setApkDownloadId(-1);
                    }
                }
            } finally {
                query.close();
            }
        }
        //蒲公英注册
        PgyUpdateManager.register(this,null,new UpdateManagerListener() {
                    @Override
                    public void onNoUpdateAvailable() {}
                    @Override
                    public void onUpdateAvailable(String s) {
                        final AppBean appBean = getAppBeanFromString(s);
                        VersionUtils.showUpdateDialog(MainActivity.this,appBean);
                    }
                }

        );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //蒲公英反注册
        PgyUpdateManager.unregister();
    }

5.下载的提示框

public class VersionUtils {


    public static void showUpdateDialog(final Context context, final AppBean appBean) {
        new AlertDialog.Builder(context)
                .setTitle("发现新版本" + appBean.getVersionName())
                .setMessage(appBean.getReleaseNote())
                .setNegativeButton("暂时忽略", null)
                .setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                        //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件
                        long apkDownloadId = downloadManager.enqueue(new DownloadManager.Request(Uri.parse(appBean.getDownloadURL()))
                                .setVisibleInDownloadsUi(false));
                        Log.e("apkUrl",appBean.getDownloadURL());
                        //保存下载的id
                        PrefUtils.setApkDownloadId(apkDownloadId);
                    }
                })
                .show();

    }
}

至此,使用DownloadMananger来实现下载的逻辑就完成了。接着,我们修改build.gradle的versionCode和versionName,在蒲公英上传新的app

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.marvinma.pgyerupdatedemo"
        minSdkVersion 18
        targetSdkVersion 25
        versionCode 2
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

android使用第三方平台(蒲公英)和DownloadManager实现APP自动更新_第3张图片

效果图:

android使用第三方平台(蒲公英)和DownloadManager实现APP自动更新_第4张图片

完整代码地址:http://download.csdn.net/download/maguifen2012/10156755

你可能感兴趣的:(android)