zoukankan      html  css  js  c++  java
  • Android学习系列(3)--App自动更新之自定义进度视图和内部存储

    友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏。
    这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。 

    这一篇是对上一篇《Android学习系列(2)--App自动更新之通知栏下载》的补充,因此只是以点为要,点到为止。
    1.内部存储
        出于考虑到用户可能禁掉了SDCard或者电脑暂时插在电脑上且为磁盘连接状态等等,对于这么个情况下,我们应该也要保证我们的程序也是能正常的运行。所以我们要考虑内部存储。
        我暂时把内部存储定在/data/data/xxxxxappxxxx/files目录,核心代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    //创建目录和文件
    if(android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())){
        updateDir = new File(Environment.getExternalStorageDirectory(),Global.downloadDir);
    }else{
        //files目录
        updateDir = getFilesDir();
    }
    updateFile = new File(updateDir.getPath(),getResources().getString(titleId)+".apk");

     2.内部存储的权限
      一起都运行的正常,但是当我们帮下下来的apk文件执行运行操作的时候,确提示如下,
     
        "解析包错误"??其实你下载的文件并不一定就是坏的或者错误的,也可能是android系统的权限在作怪。在你执行之前,加上如下核心代码:

    1
    2
    3
    4
    5
    6
    String cmd = "chmod +x " +updateFile.getPath();
    try {
        Runtime.getRuntime().exec(cmd);
    } catch (IOException e) {
        e.printStackTrace();
    }

    3.通知栏显示进度条组件的一个bug。
        在通知栏设置进度条的可见性,会无缘无故的崩溃。

    1
    2
    3
    //下面一句是没有语法错误的,但是会导致程序出错
    //为了解决这个问题,后面我们会再progressView外面包裹一层LinearLayout来控制可见性
    updateNotification.contentView.setViewVisibility(progressViewID, View.GONE);

    4.自定义进度条显示视图。
        布局文件updata_nitification.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:orientation="vertical" 
        android:layout_weight="2"
        android:paddingLeft="5dip">
        <LinearLayout android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="left|center_vertical"
            android:orientation="horizontal"
            android:layout_weight="1">  
            <ImageView android:src="@drawable/icon"
                android:layout_width="24dip"
                android:layout_height="fill_parent"
                android:scaleType="fitCenter"/>
            <TextView android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/app_name"
                android:textColor="#000000"
                android:paddingLeft="5dip"
                android:textSize="16dip"/>
        </LinearLayout>
        <LinearLayout android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="left"
            android:orientation="horizontal"
            android:layout_weight="1">  
            <TextView android:id="@+id/update_notification_progresstext"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#8F8F8F"
                android:textSize="14dip"/>
                <LinearLayout android:id="@+id/update_notification_progressblock"
                android:layout_width="fill_parent"
    	        android:layout_height="wrap_content"
    	        android:orientation="horizontal"> 
    	        <ProgressBar android:id="@+id/update_notification_progressbar" 
    	            android:layout_width="fill_parent"
    	            android:layout_height="wrap_content" 
    	            style="?android:attr/progressBarStyleHorizontal"/>
    	        </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    

        开始下载:

            updateNotification.contentIntent = updatePendingIntent;
            updateNotification.contentView.setProgressBar(com.cnblogs.tianxia.subway.R.id.update_notification_progressbar, 100, 0, false);
            updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, "0%");
    

        正在下载,显示下载进度条:

                            updateNotification.contentView.setProgressBar(com.cnblogs.tianxia.subway.R.id.update_notification_progressbar, 100, (int)(totalSize*100/updateTotalSize), false);
                            updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, (int)(totalSize*100/updateTotalSize)+"%");
                            updateNotificationManager.notify(0, updateNotification);
    

        下载完成,点击可以安装:

                        //点击安装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.contentIntent = updatePendingIntent;//安装界面
                        updateNotification.contentView.setViewVisibility(com.cnblogs.tianxia.subway.R.id.update_notification_progressblock, View.GONE);
                        updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, "下载完成,点击安装!");
                        updateNotificationManager.notify(0, updateNotification);
    

      效果图如下:
       如果你喜欢的话,请推荐一下,谢谢大家的支持! 

    作者:谦虚的天下
  • 相关阅读:
    一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用
    智能手机的工业控制应用方案——SimpleWiFi在工业控制领域应用
    一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用
    TI推出SimpleLink低能耗蓝牙CC2541
    SimpleWiFi模块评估板
    Android架构设计和软硬整合完整训练
    CentOS上解压ZIP乱码的解决办法
    更具体的描述JNI
    数据市中心全省中国mysql脚本
    几种方法枚举子集
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3580215.html
Copyright © 2011-2022 走看看