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

自动更新,其实说白了,就是下载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">

    


注册服务:



 
  

权限:

    
    
    


版本号:

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

你可能感兴趣的:(4,android,应用,系统开发)