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

来源:互联网 发布:淘宝全球购店铺申请 编辑:程序博客网 时间:2024/04/30 11:43

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

  1. app自动更新流程阐述

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

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

    一.app自动更新的流程:

    这里写图片描述

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

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

2.导入依赖

compile 'com.pgyersdk:sdk:2.5.6'

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

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 --><uses-permission android:name="android.permission.INTERNET" /> <!-- 网络通信 --><uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 获取设备信息 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取MAC地址 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读写sdcard,storage等等 --><uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 允许程序录制音频 -->

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

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

5.在蒲公英上传你开发的app,获取你的蒲公英app key,将AndroidManifest.xml中的value值换成自己的蒲公英key
这里写图片描述

三.如何使用系统自带类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监听下载广播完成的动作

 <!--下载Apk-->    <receiver android:name="com.example.marvinma.pgyerupdatedemo.ApkDownloadReceiver">        <intent-filter>            <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />        </intent-filter>    </receiver>

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'        }    }}

这里写图片描述

效果图:

这里写图片描述

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

原创粉丝点击