友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏。
这篇文章是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);

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

作者:谦虚的天下

Android学习系列(3)--App自动更新之自定义进度视图和内部存储的更多相关文章

  1. Android学习系列(2)--App自动更新之通知栏下载

    这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用.1.设计思路,使用VersionCode定义为版本升级参数. android为我们定义版本提供了2个属性:& ...

  2. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率 ...

  3. Android学习系列(17)--App列表之圆角ListView(续)

    http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html   本来这篇文章想并到上篇Android学习系列(16)- ...

  4. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  5. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  6. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  7. Android学习系列(23)--App主界面实现

    在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...

  8. Android学习系列(18)--App工程结构搭建

     本文算是一篇漫谈,谈一谈关于Android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的 ...

  9. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

随机推荐

  1. window安装Scrapy———解决报错问题

    系统是WIN10 64位Python是3.5.2今天安装pip install Scrapy  来安装发现报错Microsoft Visual C++ 14.0 is required 检查发现电脑中 ...

  2. 为什么不取消注册BroadcastReceiver会导致内存泄漏

    原始问题是这样 然后扔到了很多Android开发交流群里. 接着产生了很多的见解,我感觉比较靠谱的有以下: 网友对我问题的回答 1.onDestroy被回调代不代表Activity被回收了? 官方是这 ...

  3. AngularJs HTTP响应拦截器实现登陆、权限校验

    $httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...

  4. 巧妙利用jQuery和PHP打造类似360安全卫士防火墙功能开关(类似iphone界面)效果

    安全卫士防火墙开启关闭的开关,可以将此功能应用在产品功能的开启和关闭功能上. 准备工作为了更好的演示本例,我们需要一个数据表,记录需要的功能说明及开启状态,表结构如下: CREATE TABLE `p ...

  5. ElementUI的提示框的使用记录

    1.popover点击之后隐藏 问题描述:做了一个通知面板功能,下面提示信息有路由,每次点击消息呢,就跳转到了路由页面,但是此时这个面板没关闭,希望将其关闭 解决:官方文档有个属性 <div&g ...

  6. [Angular] Use ngx-build-plus to compile Angular Elements

    We can treat Angular Element as each standlone lib and compile each Angular element spreatly. Tool w ...

  7. Android图片与缩略

    /** * 将图片文件原比例缩略.并使其不超过最大宽.高 * @param path : 图片文件 * @param requestW : 缩略后最大宽度 * @param requestH : 缩略 ...

  8. maven下载源代码,解决中文注释为乱码的问题

    通过maven下载源代码,直接通过eclipse浏览源代码时,发现中文注释为乱码的问题.其实这个eclipse默认编码造成的问题.可以通过以下方法解决: 1.修改Eclipse中文本文件的默认编码:w ...

  9. js绝招

    1.JS判断 function IsDigit(cCheck) { //判断是否是数字return (('0'<=cCheck) && (cCheck<='9')); } ...

  10. ubuntu apache2 虚拟主机服务

    ubuntu apache2 虚拟主机服务 本次配置的是一个 ip 对应多个 虚拟主机 1:先检查 ubuntu server 是否已经安装了 apache2 web服务: apache2 -v 看到 ...