替换友盟更新的小demo

来源:互联网 发布:js获取标签的name属性 编辑:程序博客网 时间:2024/05/06 02:50

友盟更新将在2016-10-15停止更新

友盟更新将在2016-10-15停止更新,之前一直使用友盟更新的小伙伴们是不是正在忙着相应对策,

友盟更新替换友盟提供了两种更新替换方式,    一个是使用推送将自己的新版本的下载链接推送到客户端,然后客户通过点击通知栏进行更新,这只是最简洁的处理方式,但是略显low,    接下来就是第二种方法,

在闪屏界面请求服务器查询是否有新版本

大致思路

1.在闪屏界面,请求服务器2.服务器返回服务器上面最新的版本的相关的信息,包含版本信息,描述信息,是否是强制更新……3.获取本地的已经安装的软件的版本号,与服务器返回的版本号进行比对4.如果本地的版本号小于服务器,则说明需要更新5.弹出对话框提示有新版本,询问用户是否更新6.用户点击确定更新,开启更新服务,下载新版的APK7.下载完成,安装APK,完成版本更新

这是开启的下载的服务的相关代码

package com.cheletong.gyz.service;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.annotation.SuppressLint;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Intent;import android.net.Uri;import android.os.Environment;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.text.TextUtils;import com.cheletong.R;import com.cheletong.activity.start.StartActivity;public class UpdateService extends Service {    //标题      private int titleId = 0;    private final static int DOWNLOAD_COMPLETE = 0;    private final static int DOWNLOAD_FAIL = 1;    //文件存储      private File updateDir = null;    private File updateFile = null;    //通知栏      private NotificationManager updateNotificationManager = null;    private Notification updateNotification = null;    //通知栏跳转Intent      private Intent updateIntent = null;    private PendingIntent updatePendingIntent = null;    private Notification.Builder builder;    private String title = "你的项目名称";    private String downLoadUrl;    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub          return null;    }    @Override    public void onCreate() {        super.onCreate();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        //获取传值          titleId = intent.getIntExtra("titleId", 0);        downLoadUrl = intent.getStringExtra("url");        // Toast.makeText(this,"下载地址:" + downLoadUrl,Toast.LENGTH_SHORT).show();        // 如果获取到了一个空的url 就将服务器更新写死的URL设置给他        if(TextUtils.isEmpty(downLoadUrl)){            // TODO  如果获取不到下载的url 就将存放apk更新的url直接设置进来            downLoadUrl = "http://42.121.113.46:8098/cheletong/apk/cheletong.apk";        }        //创建文件        if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())) {            updateDir = new File(Environment.getExternalStorageDirectory(), "app/download/");            updateFile = new File(updateDir.getPath(), getResources().getString(titleId) + ".apk");        }        this.updateNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        builder = new Notification.Builder(this);        builder.setSmallIcon(R.drawable.icon); //设置图标        // builder.setTicker("显示第二个通知");        // builder.setContentTitle("通知"); //设置标题        // builder.setContentText("点击查看详细内容"); //消息内容        // builder.setWhen(System.currentTimeMillis()); //发送时间        // builder.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,灯光        // builder.setAutoCancel(true);//打开程序后图标消失        // Intent intent = new Intent(MainActivity.this, Center.class);        // PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);        // builder.setContentIntent(pendingIntent);        // Notification notification1 = builder.build();        // notificationManager.notify(124, notification1); // 通过通知管理器发送通知        this.updateNotification = builder.getNotification();        //设置下载过程中,点击通知栏,回到主界面          updateIntent = new Intent(this, StartActivity.class);        updatePendingIntent = PendingIntent.getActivity(this, 0, updateIntent, 0);        //设置通知栏显示内容          // updateNotification.icon = R.mipmap.ic_launcher;        // updateNotification.tickerText = "开始下载";        // updateNotification.setLatestEventInfo(this,"上海地铁","0%",updatePendingIntent);        builder.setTicker("开始下载");        builder.setContentTitle(title); //设置标题        builder.setContentText("0%"); //消息内容        // builder.setContentIntent(updatePendingIntent);        this.updateNotification = builder.getNotification();        //发出通知          updateNotificationManager.notify(0, updateNotification);        //开启一个新的线程下载,如果使用Service同步下载,会导致ANR问题,Service本身也会阻塞          new Thread(new updateRunnable()).start();//这个是下载的重点,是下载的过程          return super.onStartCommand(intent, flags, startId);    }    private Handler updateHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case DOWNLOAD_COMPLETE:                    updateNotification.flags |= updateNotification.FLAG_AUTO_CANCEL;                    //点击安装PendingIntent                      Uri uri = Uri.fromFile(updateFile);                    Intent installIntent = new Intent(Intent.ACTION_VIEW);                    installIntent.setDataAndType(uri, "application/vnd.android.package-archive");                    updatePendingIntent = PendingIntent.getActivity(UpdateService.this, 0, installIntent, 0);                    updateNotification.defaults = Notification.DEFAULT_SOUND;//铃声提醒                       // updateNotification.setLatestEventInfo(UpdateService.this, "上海地铁", "下载完成,点击安装。", updatePendingIntent);                    builder.setTicker("下载完成");                    builder.setContentTitle(title); //设置标题                    builder.setContentText("下载完成,点击安装。"); //消息内容                    builder.setContentIntent(updatePendingIntent);                    builder.setAutoCancel(true);//打开程序后图标消失                    updateNotification = builder.getNotification();                    updateNotificationManager.notify(0, updateNotification);                    //停止服务                      stopService(updateIntent);                    break;                case DOWNLOAD_FAIL:                    //下载失败                      // updateNotification.setLatestEventInfo(UpdateService.this, "上海地铁", "下载完成,点击安装。", updatePendingIntent);                    builder.setTicker("下载失败");                    builder.setContentTitle(title); //设置标题                    builder.setContentText("下载失败..."); //消息内容                    // builder.setContentIntent(updatePendingIntent);                    builder.setAutoCancel(true);//打开程序后图标消失                    updateNotification = builder.getNotification();                    updateNotificationManager.notify(0, updateNotification);                    break;                default:                    stopService(updateIntent);            }        }    };    class updateRunnable implements Runnable {        Message message = updateHandler.obtainMessage();        public void run() {            message.what = DOWNLOAD_COMPLETE;            try {                //增加权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">;                  if (!updateDir.exists()) {                    updateDir.mkdirs();                }                if (!updateFile.exists()) {                    updateFile.createNewFile();                }                //下载函数,以QQ为例子                  //增加权限<uses-permission android:name="android.permission.INTERNET">;                  long downloadSize = downloadUpdateFile("http://softfile.3g.qq.com:8080/msoft/179/1105/10753/MobileQQ1.0(Android)_Build0198.apk", updateFile);                // TODO 设置下载的连接为从之前页面解析万json之后获取到的url                // long downloadSize = downloadUpdateFile(downLoadUrl, updateFile);                if (downloadSize > 0) {                    //下载成功                      updateHandler.sendMessage(message);                    // 下载完成之后自动安装应用                    Intent intent = new Intent();                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                    intent.setAction(android.content.Intent.ACTION_VIEW);                    intent.setDataAndType(Uri.fromFile(updateFile),                            "application/vnd.android.package-archive");                    startActivity(intent);                }            } catch (Exception ex) {                ex.printStackTrace();                message.what = DOWNLOAD_FAIL;                //下载失败                  updateHandler.sendMessage(message);            }        }    }    @SuppressLint("NewApi")    public long downloadUpdateFile(String downloadUrl, File saveFile) throws Exception {        //这样的下载代码很多,我就不做过多的说明          int downloadCount = 0;        int currentSize = 0;        long totalSize = 0;        int updateTotalSize = 0;        HttpURLConnection httpConnection = null;        InputStream is = null;        FileOutputStream fos = null;        try {            URL url = new URL(downloadUrl);            httpConnection = (HttpURLConnection) url.openConnection();            httpConnection.setRequestProperty("User-Agent", "PacificHttpClient");            if (currentSize > 0) {                httpConnection.setRequestProperty("RANGE", "bytes=" + currentSize + "-");            }            httpConnection.setConnectTimeout(10000);            httpConnection.setReadTimeout(20000);            updateTotalSize = httpConnection.getContentLength();            if (httpConnection.getResponseCode() == 404) {                throw new Exception("fail!");            }            is = httpConnection.getInputStream();            fos = new FileOutputStream(saveFile, false);            byte buffer[] = new byte[4096];            int readsize = 0;            while ((readsize = is.read(buffer)) > 0) {                fos.write(buffer, 0, readsize);                totalSize += readsize;                //为了防止频繁的通知导致应用吃紧,百分比增加10才通知一次                  if ((downloadCount == 0) || (int) (totalSize * 100 / updateTotalSize) - 10 > downloadCount) {                    downloadCount += 10;                    // updateNotification.setLatestEventInfo(UpdateService.this, "正在下载", (int) totalSize * 100 / updateTotalSize + "%", updatePendingIntent);                    builder.setTicker("正在下载");                    builder.setContentTitle(title); //设置标题                    builder.setProgress(100, (int) totalSize * 100 / updateTotalSize + 9, false);                    builder.setContentText("当前下载进度:"+(int) totalSize * 100 / updateTotalSize + "%"); //消息内容                    // builder.setContentIntent(updatePendingIntent);                    updateNotification = builder.getNotification();                    updateNotificationManager.notify(0, updateNotification);                }            }        } finally {            if (httpConnection != null) {                httpConnection.disconnect();            }            if (is != null) {                is.close();            }            if (fos != null) {                fos.close();            }        }        return totalSize;    }}  

这是弹出是否更新的对话框的相关代码

……比较乱,直接上传demo吧
下载地址:http://download.csdn.net/detail/u010838785/9640176

1 0
原创粉丝点击