Android 通过DownloadManager实现自动更新的demo

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

自动更新,其实说白了,就是下载apk,安装apk。

代码下载地址:Android自动更新的demo


实现自动更新的路径两种:

第一种:(可以参考http://blog.csdn.net/furongkang/article/details/6886526

0:下载配置文件

1:查看配置文件里面的版本信息,如果版本信息比当前的版本的大,那么就执行下面的,否则不更新

2:下载apk

3:安装apk
第二种:(可以参考 http://blog.csdn.net/evn512457/article/details/28626621

如果后台可以提供一个接口也可以,就是我们将当前的版本传过去,然后后台返回是否需要更新,如果需要,给出url,

下载apk,

安装apk,


我们这里不考虑下载配置文件和解析配置文件的内容,我们采用第二种,就是我们获取了更新的apk的网络地址,如何更新。


步骤和全部代码如下:


0:服务UpdateServer,里面包含了广播接收者就是接收什么时候下载完了,下载完了就开始安装
1:然后在主界面可以添加一个按钮,也可以不添加,添加主要为了更好的看到效果而已,在按钮的点击事件里面启动上面的服务
2:记得注册服务,权限,还有版本号的修改


UpdateService

/** * Created by Kodulf on 2017/5/8. */import android.app.DownloadManager;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.net.Uri;import android.os.Build;import android.os.Environment;import android.os.IBinder;import android.util.Log;/** * http://blog.csdn.net/rodulf/article/details/51706788 */public class UpdateService extends Service {    public UpdateService() {    }    /** 安卓系统下载类 **/    DownloadManager manager;    /** 接收下载完的广播 **/    DownloadCompleteReceiver receiver;    /** 初始化下载器 **/    private void initDownManager() {        manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);        receiver = new DownloadCompleteReceiver();        //设置下载地址        String urlPath = "http://47.93.61.22/wordpress/app-release.apk";        Uri parse = Uri.parse(urlPath);        DownloadManager.Request down = new DownloadManager.Request(parse);//     百度音乐           Uri.parse("http://gdown.baidu.com/data/wisegame/fd84b7f6746f0b18/baiduyinyue_4802.apk"));//    乐视体育         //Uri.parse("http://122.228.237.132/apk.r1.market.hiapk.com/data/upload/apkres/2016/6_12/16/com.lesports.glivesports_040405.apk"));        // 设置允许使用的网络类型,这里是移动网络和wifi都可以        down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);        // 下载时,通知栏显示途中        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {            down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);        }        // 显示下载界面        down.setVisibleInDownloadsUi(true);        // 设置下载后文件存放的位置        String apkName = parse.getLastPathSegment();        down.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, apkName);        // 将下载请求放入队列        manager.enqueue(down);        //注册下载广播        registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        // 调用下载        initDownManager();        return super.onStartCommand(intent, flags, startId);    }    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onDestroy() {        // 注销下载广播        if (receiver != null)            unregisterReceiver(receiver);        super.onDestroy();    }    // 接受下载完成后的intent    class DownloadCompleteReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            //判断是否下载完成的广播            if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {                //获取下载的文件id                long downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);                Log.d("kodulf","id="+downId);                //自动安装apk                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {                    Uri uriForDownloadedFile = manager.getUriForDownloadedFile(downId);                    Log.d("kodulf","uri="+uriForDownloadedFile);                    installApkNew(uriForDownloadedFile);                }                //停止服务并关闭广播                UpdateService.this.stopSelf();            }        }        //安装apk        protected void installApkNew(Uri uri) {            Intent intent = new Intent();            //执行动作            intent.setAction(Intent.ACTION_VIEW);            //执行的数据类型            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            intent.setDataAndType(uri, "application/vnd.android.package-archive");            //不加下面这句话是可以的,查考的里面说如果不加上这句的话在apk安装完成之后点击单开会崩溃            // android.os.Process.killProcess(android.os.Process.myPid());            try {                startActivity(intent);            }catch (Exception e){                e.printStackTrace();            }        }    }}

MainActivity:

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    /**     *     * @param view     */    public void update(View view) {        new Thread(new Runnable() {            @Override            public void run() {                //启动服务                Intent service = new Intent(MainActivity.this,UpdateService.class);                startService(service);            }        }).start();            }}


xml:


    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="tech.androidstudio.autoupdate.MainActivity">    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="开始更新"        android:textColor="@android:color/holo_red_dark"        android:onClick="update"/></RelativeLayout>


注册服务:

<pre name="code" class="html"><service android:name=".UpdateService"    android:enabled="true"/>


 
  

权限:

    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />


版本号:

builder.gradler 里面的

defaultConfig {        applicationId "tech.androidstudio.autoupdate"        minSdkVersion 9        targetSdkVersion 23        versionCode 1        versionName "1.0.0"    }


+++++++++++++++++++++++++++++++++++++++++++++++++++++++
实验的步骤:

0:将代码中的gradler 里面的版本号修改为2,生成app-release.apk,将这个apk 放到我们的服务器上面,例如我们自己的tomcat的服务器上面

1:修改DownloadManager里面的URL 指向我们的tomcat 上面的地址,一定要记住了不能使用127.0.0.1 而是要用实际的ip地址例如192.168.0.128

要保证这个URL 在浏览器中输入的时候可以直接下载上面的版本2的apk

2:将代码中的gradler里面的版本号修改为1,生成app-release.apk

3:将这个apk 安装到手机上面,点击中间的更新按钮,就可以安装了。


参考: http://blog.csdn.net/evn512457/article/details/28626621           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_43682769/article/details/84106754