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

对于安卓用户来说,手机应用更新是很频繁的,我们不能在每一次升级版本的时候,都让用户再去应用市场上重新下载一遍,这样是很不友好的。因此,在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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
蒲公英是一款非常受欢迎的Android应用,它提供了各种各样的应用程序和游戏供用户下载和安装。每当一个应用程序更新时,蒲公英也会相应更新蒲公英更新频率通常会视具体情况而定。当开发者发布一个新的应用程序版本时,蒲公英就会通过自动更新机制提供给用户。这样一方面可以让用户第一时间体验到新的功能和修复的bug,另一方面也可以确保应用程序的安全性。 蒲公英更新方式一般有两种:主动更新和被动更新。主动更新是指当用户打开蒲公英应用程序时,蒲公英会检查是否有新的版本可供下载。如果有新版本,用户会收到一个通知,可以选择立即更新或稍后再更新。被动更新是指蒲公英会在后台检查应用程序是否有可用的更新,并在用户打开蒲公英自动进行更新。 当用户选择更新应用程序时,蒲公英会下载最新的应用程序文件并安装在用户的设备上。安装完成后,用户可以立即使用新版本的应用程序。 蒲公英更新除了提供新的功能和bug修复外,还可能包括性能优化、界面改进、安全性增强等方面的改进。开发者会根据用户的反馈和市场变化来持续改进和更新应用程序,以提供更好的用户体验。 综上所述,蒲公英Android应用程序会不断更新,以提供新的功能、修复bug,并不断改进用户体验。用户可以通过主动更新或被动更新方式获得最新的应用程序版本,并享受到更新带来的各种好处。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值