zoukankan      html  css  js  c++  java
  • Android程序版本更新--通知栏更新下载安装(转)

    Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下:

    • 检查当前版本号

    AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新版本的apk,versioncode大于当前版本,下面代码用来获取versioncode的值

    PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
    int localVersion = packageInfo.versionCode;

    用当前versioncode和服务端比较,如果小于,就进行版本更新

    • 下载apk文件
    复制代码
     /**
       * 下载apk
       * 
       * @param apkUri
       */
    private void downLoadNewApk(String apkUri, String version) { manager = (NotificationManager) context .getSystemService((context.NOTIFICATION_SERVICE)); notify = new Notification(); notify.icon = R.drawable.ic_launcher; // 通知栏显示所用到的布局文件 notify.contentView = new RemoteViews(context.getPackageName(), R.layout.view_notify_item); manager.notify(100, notify); //建立下载的apk文件 File fileInstall = FileOperate.mkdirSdcardFile("downLoad", APK_NAME + version + ".apk"); downLoadSchedule(apkUri, completeHandler, context, fileInstall); }
    复制代码
    FileOperate是自己写的文件工具类

    通知栏显示的布局,view_notify_item.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:background="#00000000"
        android:padding="5dp" >
    
        <ImageView
            android:id="@+id/notify_icon_iv"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:src="@drawable/ic_launcher" />
    
        <TextView
            android:id="@+id/notify_updata_values_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="6dp"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="5dp"
            android:layout_toRightOf="@id/notify_icon_iv"
            android:gravity="center_vertical"
            android:text="0%"
            android:textColor="@color/white"
            android:textSize="12sp" />
    
        <ProgressBar
            android:id="@+id/notify_updata_progress"
            style="@android:style/Widget.ProgressBar.Horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/notify_icon_iv"
            android:layout_marginTop="4dp"
            android:max="100" />
    </RelativeLayout>
    复制代码
    复制代码
       /**
         * 连接网络,下载一个文件,并传回进度
         * 
         * @param uri
         * @param handler
         * @param context
         * @param file
         */
    public static void downLoadSchedule(final String uri, final Handler handler, Context context, final File file) { if (!file.exists()) { handler.sendEmptyMessage(-1); return; } // 每次读取文件的长度 final int perLength = 4096; new Thread() { @Override public void run() { super.run(); try { URL url = new URL(uri); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setDoInput(true); conn.connect(); InputStream in = conn.getInputStream(); // 2865412 long length = conn.getContentLength(); // 每次读取1k byte[] buffer = new byte[perLength]; int len = -1; FileOutputStream out = new FileOutputStream(file); int temp = 0; while ((len = in.read(buffer)) != -1) { // 写入文件 out.write(buffer, 0, len); // 当前进度 int schedule = (int) ((file.length() * 100) / length); // 通知更新进度(10,7,4整除才通知,没必要每次都更新进度) if (temp != schedule && (schedule % 10 == 0 || schedule % 4 == 0 || schedule % 7 == 0)) { // 保证同一个数据只发了一次 temp = schedule; handler.sendEmptyMessage(schedule); } } out.flush(); out.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); }
    复制代码

    handler根据下载进度进行更新

    • 更新通知栏进度条
    复制代码
    /**
      * 更新通知栏
      */
    private Handler completeHandler = new Handler() { public void handleMessage(android.os.Message msg) { // 更新通知栏 if (msg.what < 100) { notify.contentView.setTextViewText( R.id.notify_updata_values_tv, msg.what + "%"); notify.contentView.setProgressBar(R.id.notify_updata_progress, 100, msg.what, false); manager.notify(100, notify); } else { notify.contentView.setTextViewText( R.id.notify_updata_values_tv, "下载完成"); notify.contentView.setProgressBar(R.id.notify_updata_progress, 100, msg.what, false);// 清除通知栏 manager.cancel(100); installApk(fileInstall); } }; };
    复制代码

    下载完成后调用系统安装。

    • 安装apk
    复制代码
    /**
      * 安装apk
      * 
      * @param file
      */
    private void installApk(File file) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); }
    复制代码

    安装完成搞定

  • 相关阅读:
    首次成功实施 XSS 攻击,盗取目标网站大量 VIP 帐号
    框架模块设计经验总结
    OEA ORM 框架中的冗余属性设计
    UML 图使用心得
    Scrum 流程应用反思 我们的团队
    分享一个简单的 VS 插件及源码
    PDA使用感悟
    OEA 框架中集成的 RDLC 报表介绍
    私活后的 WPF 设计经验总结
    个人管理/时间管理 辅助工具套件分享
  • 原文地址:https://www.cnblogs.com/dongweiq/p/3926659.html
Copyright © 2011-2022 走看看